2017-03-13 33 views
7

Socket based event push architecture 我有寫在節點JS套接字服務器應用程序,託管在亞馬遜EBS(彈性豆稈),這是由負載平衡器插槽IO上ELB,需要連接到應用服務器的所有實例

客戶管理連接到套接字並傳遞指定的ID,例如event_id,我的應用程序創建名爲「event_ event_id」的房間並加入房間。不同的客戶有不同的「事項標識」

lambda函數連接到插座併發出名爲「event_push」事件到應用程序與諸如事項標識

必要的數據每當我的套接字應用程序(在例子中的一個EBS)檢測與event_id推的事件,它播出的推數據到房間「event_ event_id」的所有成員,因此所有成員得到通知,該事件的

客戶端可以連接任何服務器,通過負載均衡,並決定粘性會話可以保持連接

現在我的問題: 有沒有辦法發出了「event_push」只能有一個名爲「event_ event_id

QN室服務器:有沒有一種方法來發射事件在服務器上的所有實例EBS? 或 問題:是否有其他解決方案?

+0

可能的解決方案:可以具有可以接收事件詳細信息的持久連接的中央訂閱/發佈服務器。套接字服務器可以訂閱中央服務器,以便在發生事件時通過持久連接將其推送到所有訂閱的套接字服務器。 – Ima

回答

0

你可以做的是你可以使用Redis或mongoDb來保存一些關於你的事件event_event_id的信息。您可以保存在數據存儲這些信息,例如樣本文檔

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

現在這是什麼會做的是你將有哪些事件屬於哪個服務器的信息。現在,如果負載均衡器將server1的請求發送到服務器2,並且服務器2不能識別該請求,則可以在服務器之間創建通信通道(可以使用socketio,microservice或其他任何方式),並將該請求重定向到服務器1,以便它可以觸發該特定的套接字事件。

當觸發斷開連接事件時,您必須從mongo或redis中刪除套接字ID。

+0

1.我的服務器由Elastic Bean Stalk啓動,您永遠不會知道哪個服務器啓動,哪個服務器關閉,或者新服務器初始化時。因此,在這種情況下,服務器之間的通信毫無疑問。 – Ima

+0

2.您永遠不會知道哪個用戶連接到哪個服務器,這是關於從瀏覽器到服務器的套接字連接,連接是持久的,並且由於2個原因,客戶端(瀏覽器)無法建立與特定服務器的連接。 a)服務器總是沒有啓動,但由EBS管理,客戶端(瀏覽器)沒有關於服務器的任何信息。 b)連接由彈性負載均衡器(ELB) – Ima

+0

確定。事件不限於任何用戶或任何其他實體,因此我不能按照您的建議進行綁定。 – Ima

相關問題