2015-09-18 101 views
0

要保存大猩猩websocket連接,我可以這樣的事情,其中​​的密鑰可以是userId。運行GO應用程序的多個實例時的大猩猩websocket連接

connections := make(map[int]*connection) 

我使用一種叫做supervisord

http://supervisord.org/

這是一個過程控制系統,使我能夠在後臺作爲守護程序運行的Go應用程序 。看起來好像有幾個實例正在產生。

enter image description here

難道這些實例知道如何訪問相同的連接變量,如果我讓全球?

var connections map[int]*connection 

還是會有問題?

此外,由於映射不是線程安全的,我應該創建一個結構並添加sync.RWMutex,然後在檢查密鑰是否存在或從密鑰刪除密鑰之前執行RLock()/ Lock()和RUnlock()/ Unlock地圖?

回答

1

首先,這些不是進程而是線程,所以它們確實會共享相同的全局狀態。 htop shows threads as if they were processes

無論何時您需要同時訪問地圖,您都需要對其進行同步。你確實可以用互斥鎖來做到這一點。

+0

謝謝!如果我使用多臺服務器進行負載平衡會怎麼樣?我將如何解決保存大猩猩websocket連接的問題,以便所有服務器都能夠訪問它? – Aiden

+0

@Aiden你必須序列化連接。我不認爲這是可能的。你必須重新考慮你的設計 – rightfold

+0

一種方法是粘性會話。 – elithrar