使用EC2實例(以及Amazon Auto Scaling和Elastic Load Balancing)我有幾個在Amazon Web Services中運行的TCP服務器實例。每個EC2實例都有權訪問集中式數據庫(在Amazon RDS上運行)。爲了使這個後端可擴展,新的EC2實例(TCP服務器的實例)根據需求進行放大和縮小。在EC2實例上擴展TCP服務器的分佈式問題
服務器已經使用Python Twisted框架製造。該系統支持自定義即時消息服務,可以加入多個羣聊。
當用戶開始使用服務時,他們與其中一個TCP服務器建立TCP套接字。每個服務器在內存中存儲當前連接的用戶(即,開放的TCP套接字)以及每個用戶當前「進入」(並因此訂閱)的「羣組聊天」。所有創建的聊天數據都存儲在數據庫中。
的問題
當用戶A職位GroupChatZ消息,所有用戶在「GroupChatZ應收到該郵件。如果只有一個TCP服務器,這很簡單:它將在'該羣組聊天'中爲其所有用戶搜索內存並向他們發送新消息。但是,由於存在多個服務器,因此在創建新消息時,該服務器必須將消息傳遞給所有其他服務器(即EC2實例)。
這個問題最有效的解決方案是什麼? 也許使用AWS組件。
一個解決方案,我能想到的是爲每個服務器來存儲它的IP地址在數據庫中時,第一次啓動,並得到其他所有連接的服務器的IP地址和與他們建立TCP連接。當收到每條新消息時,處理該消息的服務器可以將其發送給所連接的所有其他服務器。
但是,TCP連接不是100%可靠的,這種解決方案增加了複雜性。
我懷疑居然還有使用一些Amazon Web服務組件來實現一個簡單的用戶,出版商型機制的好辦法(認爲Observer設計模式)。即其中一臺服務器添加了一些其他服務器實時收到的信息。
快速更新,我剛剛開始關注Amazon SNS並創建每個Twisted服務器將訂閱的主題。迄今爲止的結果看起來很有希望 – 2012-03-27 01:27:23