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