Ý chính
Tôi có một ứng dụng chạy trên kiến trúc dựa trên microservice (trên Kubernetes). Tất cả các giao tiếp đến / từ bên ngoài ứng dụng xảy ra thông qua API Gateway .
Điều đó chỉ có nghĩa là các yêu cầu từ frontend của tôi không trực tiếp đến các dịch vụ, nhưng chúng phải đi qua Cổng.
Động cơ
Bây giờ tôi cần triển khai một tính năng yêu cầu giao tiếp thời gian thực giữa giao diện và dịch vụ nội bộ. Nhưng vì dịch vụ nội bộ không được tiếp xúc với bên ngoài, tôi cần một cách để "định tuyến" dữ liệu thời gian thực thông qua Cổng.
Tất cả các dịch vụ của tôi đang chạy trên Node.js, đó là lý do tôi muốn sử dụng Socket.IO để thực hiện giao tiếp thời gian thực.
Vấn đề
Nhưng làm thế nào để thực hiện mũi tên kép màu tím từ bản phác thảo?
Vì vậy, thông thường máy khách frontend sẽ kết nối với máy chủ nơi Socket.IO đang chạy. Nhưng trong trường hợp của tôi, máy chủ này (máy chủ tính năng thời gian thực) không thể truy cập được từ máy khách (và không bao giờ nên), điều đó có nghĩa là máy khách phải kết nối với Cổng. Do đó, Gateway cần thực hiện một số cơ chế để định tuyến tất cả các tin nhắn đến dịch vụ thời gian thực và ngược lại.
Ý tưởng
(1) Có máy chủ HTTP thứ hai lắng nghe các sự kiện trên Cổng và phát ra các sự kiện đó đến máy chủ thời gian thực. Theo hướng khác, máy chủ thời gian thực sẽ phát ra các sự kiện đến Cổng, sau đó sẽ phát chúng ra giao diện. Tôi nghĩ rằng phương pháp này chắc chắn sẽ hiệu quả, nhưng dường như dư thừa để phát ra mọi thứ hai lần. Và nó chắc chắn sẽ làm tổn thương hiệu suất?
(2) Sử dụng Bộ điều hợp Socket.IO để " truyền sự kiện giữa các nút ", đây có vẻ là cách đúng đắn vì nó được sử dụng để "truyền tin nhắn giữa các tiến trình hoặc máy tính". Nhưng tôi có vấn đề khi bắt đầu vì thiếu tài liệu / ví dụ. Tôi cũng không sử dụng Redis (có cần sử dụng bộ chuyển đổi không?)
(3) Sử dụng gói socket.io-emitter , có vẻ như không phải là một lựa chọn tốt vì lần cam kết cuối cùng là từ 3 năm trước.
(4) Cái gì khác?
nginx
như một bộ điều khiển xâm nhập. Bạn có thể sử dụng haproxy là tốt nếu bạn thích. Bạn sẽ có 2 dịch vụ (triển khai) 1 để quản lý các yêu cầu HTTP và 1 để quản lý các yêu cầu ổ cắm. Sử dụng xâm nhập, bạn có thể hiển thị đường dẫn và chuyển hướng lưu lượng truy cập đến đúng dịch vụ, ví dụ: mọi yêu cầu được nhấn /socket
sẽ được chuyển hướng đến socket-service
ứng dụng.
ingress-controller
k8s sẽ gửisocket
lưu lượng đến dịch vụ bóng đá.