本來有個業(yè)務(wù)放在Applications/App1下,
現(xiàn)在要做個消息隊列,單獨開了個GatewayWorker,為App2,
但客戶端連接的是App1的Gateway,
在App2中處理消息隊列時,如何發(fā)消息給App1中的某個客戶端?
@walkor
現(xiàn)在碰到類似的問題。用了GatewayWorker,一個項目使用了2個,一個為大廳服務(wù),一個為聊天服務(wù)。
現(xiàn)在需求是:客戶端同時保持大廳與聊天服務(wù)的兩個連接,數(shù)據(jù)共享通過redis?,F(xiàn)在有想法是希望聊天服務(wù)和大廳服務(wù)互相通信,有看到上面的鏈接,覺得每個服務(wù)內(nèi)新增一個Text協(xié)議的InnerGatewayWorker可以滿足要求。
問題如下:
1、stream_socket_client() 互相調(diào)用的該連接是每個服務(wù)中(假設(shè)每個服務(wù)開啟4進(jìn)程)的進(jìn)程都得新建一個嗎? 如何保持連接? 需要做保持連接的額外操作嗎?例如加心跳? 直接在OnWorkerStart中創(chuàng)建好連接? 還是每次發(fā)消息進(jìn)行創(chuàng)建新的,用完就close? 接收者如何定位每個真正客戶端的連接是在哪個進(jìn)程中的(worker id)?
2、此時我還有一個Java寫的用于處理一些純邏輯的常駐程序,用Gearman進(jìn)行 聊天服務(wù)中的Job創(chuàng)建和回調(diào),因Java程序是常駐的,所以也希望能夠主動發(fā)起給聊天服務(wù)的結(jié)果消息,從而轉(zhuǎn)發(fā)給真正的客戶。那么Java程序這邊也是創(chuàng)建一個tcp的長連接嗎? 如1問題中,需要做額外的保持連接? 還是每次用完就close?
謝謝!
1、每次新建一個鏈接好一些,用完關(guān)閉。因為php-fpm沒辦法及時處理鏈接斷開事件,也沒有定時器的功能,php-fpm下維持的長鏈接不好做定時發(fā)心跳給服務(wù)端,如果鏈接斷開無法及時發(fā)現(xiàn)導(dǎo)致業(yè)務(wù)異常。
2、java程序可以創(chuàng)建一個長鏈接到GatewayWorker,定時發(fā)送數(shù)據(jù)保持鏈接,能夠及時處理鏈接斷開等事件。
"覺得每個服務(wù)內(nèi)新增一個Text協(xié)議的InnerGatewayWorker可以滿足要求。" 這個我昨晚沒做嘗試,只是看了文檔后產(chǎn)生的想法,現(xiàn)在的疑惑是 在某一個websocket GatewayWorker的Application中增加一個Text InnerGatewayWorker可以共用一個Events.php?
你的回復(fù)1中,我確認(rèn)下。我是在兩個GatewayWorker的Application(例如A、B)中,分別給A、B建立一個InnerGatewayWorker-A和InnerGatewayWorker-B(這兩個Inner是分別共享對應(yīng)的A、B的Events),A、B要互發(fā)內(nèi)容是通過stream_socket_client() 分別和Inner-B和Inner-A來創(chuàng)建連接/發(fā)送消息/關(guān)閉。 回復(fù)2中,Java程序到GatewayWorker中的連接時通過一個特殊ID來標(biāo)識嗎? 有無別的方式?例如直接內(nèi)部通信的方案
1、是對的
2、GatewayWorker中可以通過$_SERVER['GATEWAY_PORT']來判斷是哪個端口發(fā)來的數(shù)據(jù),就可以識別是不是內(nèi)部端口了