2017-03-13 17 views
7

Socket based event push architecture Tôi có một ứng dụng máy chủ ổ cắm viết trên js nút, lưu trữ trên Amazon EBS (Elastic đậu rỗi) được quản lý bởi cân bằng tảiỔ cắm io trên ELB, cần phải kết nối với tất cả các trường hợp của máy chủ ứng dụng

Khách hàng kết nối với socket và vượt qua id được chỉ định, nói event_id ứng dụng của tôi tạo phòng có tên "event_ event_id" và tham gia phòng. khách hàng khác nhau có khác nhau "event_id"

Một chức năng lambda kết nối với ổ cắm và phát ra một sự kiện mang tên "event_push" cho các ứng dụng với các dữ liệu cần thiết như event_id

Bất cứ khi nào ứng dụng ổ cắm của tôi (tại một trong những trường hợp trong EBS) phát hiện một sự kiện push với event_id, nó phát sóng các dữ liệu đẩy cho tất cả các thành viên của phòng "event_ event_id", do đó tất cả các thành viên được thông báo về sự kiện này

khách hàng có thể kết nối bất kỳ máy chủ, bằng cách cân bằng tải và quyết định phiên cố định có thể duy trì kết nối

Bây giờ vấn đề của tôi: Có cách nào để phát ra các "event_push" để chỉ máy chủ có một căn phòng có tên là "event_ event_id"

Qn: Có một cách để phát ra một sự kiện cho tất cả các trường hợp của các máy chủ trong EBS? HOẶC Qn: Có giải pháp thay thế nào không?

+0

Giải pháp có thể có: Máy chủ đăng ký/xuất bản trung tâm có thể có kết nối liên tục có thể nhận được chi tiết sự kiện. Các máy chủ socket có thể đăng ký với máy chủ trung tâm để khi có sự kiện, sẽ được đẩy tới tất cả các máy chủ socket đã đăng ký qua kết nối liên tục. – Ima

Trả lời

0

Những gì bạn có thể làm là bạn có thể sử dụng Redis hoặc mongoDb để lưu một số thông tin về trong trường hợp của bạn event_event_id. Bạn có thể lưu thông tin này vào lưu trữ dữ liệu ví dụ: mẫu tài liệu

{ 
    _id : ObjectId, 
    userId : 23, 
    event : event_event_id, 
    server : 1 
}, 
{ 
    _id : ObjectId, 
    userId : 23, 
    event : event_event_id, 
    server : 2 
} 

Bây giờ việc này sẽ là thông tin mà sự kiện thuộc về máy chủ nào. Bây giờ nếu loadbalancer gửi yêu cầu server1 đến server 2 và server 2 không nhận ra yêu cầu bạn có thể tạo kênh truyền thông giữa các máy chủ (bạn có thể sử dụng socketio, microservice hoặc bất kỳ thứ gì) và chuyển hướng yêu cầu đó tới máy chủ 1 để nó có thể kích hoạt ổ cắm cụ thể đó biến cố.

Bạn phải xóa id ổ cắm khỏi mongo hoặc redis khi ngắt kết nối sự kiện được kích hoạt.

+0

1. Máy chủ của tôi được khởi động bởi Elastic Bean Stalk, bạn sẽ không bao giờ biết máy chủ nào đang hoạt động và máy chủ nào bị hỏng hoặc khi máy chủ mới được khởi chạy. Vì vậy, thông tin liên lạc giữa các máy chủ là trong câu hỏi trong kịch bản này. – Ima

+0

2. Bạn sẽ không bao giờ biết người dùng nào được kết nối với máy chủ nào, đây là kết nối socket từ trình duyệt đến máy chủ, kết nối liên tục và máy khách (Trình duyệt) không thể thiết lập kết nối với máy chủ cụ thể do 2 lý do. a) Các máy chủ không phải lúc nào cũng lên, nhưng được quản lý bởi EBS và máy khách (Trình duyệt) không có bất kỳ thông tin nào về các máy chủ. b) Kết nối được xác định bởi cân bằng tải đàn hồi (ELB) – Ima

+0

Các sự kiện cũng không bị hạn chế đối với bất kỳ người dùng nào hoặc bất kỳ thực thể nào khác, vì vậy tôi không thể thực hiện ràng buộc như bạn đã đề xuất. – Ima

Các vấn đề liên quan