大致都瀏覽了好幾次文檔了,有幾個疑惑:
看了文檔里實例里worker的count都是設(shè)置成4,問題來了,那么一個多websocket客戶端連接到服務(wù)器肯定是會按一定規(guī)律分配給不同的worker,多進程間數(shù)據(jù)是無法共享的,那么廣播群發(fā),workerman怎么處理的,利用了什么機制,內(nèi)存數(shù)據(jù)共享機制嗎? 我看了下大致的源碼,找到一個gateway類里有一個_clientConnections,不明白這個是怎么共享的,而且gateway也是有count設(shè)置成4個進程的,不解
之前看了下workerman源碼,沒看到有共享內(nèi)存操作的代碼。也就是進程間的數(shù)據(jù)不是共享的。
如果業(yè)務(wù)要共享數(shù)據(jù)用redis mysql會好一些。
看gateway源碼是利用了進程間通訊來做到多進程廣播數(shù)據(jù)的。businessWorker和每個gateway都有內(nèi)部連接,要廣播時直接給每個gateway內(nèi)部連接發(fā)個消息就好了,如果是給某個連接發(fā)消息,只需要給對應(yīng)的gateway內(nèi)部連接發(fā)消息就好了。businessWorker和每個gateway都是tcp socket相連的,我感覺用unix socket性能可能會更好一些,不知道作者為啥選了tcp socket。
簡單說,在 GatewayWorker 框架下,存在多個 Gateway 實例和多個 BusinessWorker 實例,在 Register 的協(xié)調(diào)下,Gateway 知道所有的 BusinessWorker,BusinessWorker 也知道所有的 Gateway。
Gateway 收到客戶的請求時,挑一個 BusinessWorker 來處理,并回傳處理結(jié)果。
BusinessWorker 如果有組播或者廣播的需求,就通知所有的 Gateway 一起干。