如何在多个GatewayWorker间互发消息?

JoeZing

本来有个业务放在Applications/App1下,
现在要做个消息队列,单独开了个GatewayWorker,为App2,
但客户端连接的是App1的Gateway,
在App2中处理消息队列时,如何发消息给App1中的某个客户端?

4575 4 0
4个回答

walkor

参考手册 在其它项目中推送
http://www.workerman.net/gatewaydoc/advanced/push.html

  • 暂无评论
selectotz

@walkor
现在碰到类似的问题。用了GatewayWorker,一个项目使用了2个,一个为大厅服务,一个为聊天服务。

现在需求是:客户端同时保持大厅与聊天服务的两个连接,数据共享通过redis。现在有想法是希望聊天服务和大厅服务互相通信,有看到上面的链接,觉得每个服务内新增一个Text协议的InnerGatewayWorker可以满足要求。
问题如下:
1、stream_socket_client() 互相调用的该连接是每个服务中(假设每个服务开启4进程)的进程都得新建一个吗? 如何保持连接? 需要做保持连接的额外操作吗?例如加心跳? 直接在OnWorkerStart中创建好连接? 还是每次发消息进行创建新的,用完就close? 接收者如何定位每个真正客户端的连接是在哪个进程中的(worker id)?

2、此时我还有一个Java写的用于处理一些纯逻辑的常驻程序,用Gearman进行 聊天服务中的Job创建和回调,因Java程序是常驻的,所以也希望能够主动发起给聊天服务的结果消息,从而转发给真正的客户。那么Java程序这边也是创建一个tcp的长连接吗? 如1问题中,需要做额外的保持连接? 还是每次用完就close?

谢谢!

  • 暂无评论
selectotz

@walkor

1中如何给客户端发消息的知道了,因为绑定了UID的,直接sendToUid

  • 暂无评论
walkor

1、每次新建一个链接好一些,用完关闭。因为php-fpm没办法及时处理链接断开事件,也没有定时器的功能,php-fpm下维持的长链接不好做定时发心跳给服务端,如果链接断开无法及时发现导致业务异常。

2、java程序可以创建一个长链接到GatewayWorker,定时发送数据保持链接,能够及时处理链接断开等事件。

  • selectotz 2017-05-26

    "觉得每个服务内新增一个Text协议的InnerGatewayWorker可以满足要求。" 这个我昨晚没做尝试,只是看了文档后产生的想法,现在的疑惑是 在某一个websocket GatewayWorker的Application中增加一个Text InnerGatewayWorker可以共用一个Events.php?

  • walkor 2017-05-26

  • selectotz 2017-05-26

    Thanks

  • selectotz 2017-05-26

    你的回复1中,我确认下。我是在两个GatewayWorker的Application(例如A、B)中,分别给A、B建立一个InnerGatewayWorker-A和InnerGatewayWorker-B(这两个Inner是分别共享对应的A、B的Events),A、B要互发内容是通过stream_socket_client() 分别和Inner-B和Inner-A来创建连接/发送消息/关闭。 回复2中,Java程序到GatewayWorker中的连接时通过一个特殊ID来标识吗? 有无别的方式?例如直接内部通信的方案

  • walkor 2017-05-26

    1、是对的
    2、GatewayWorker中可以通过$_SERVER['GATEWAY_PORT']来判断是哪个端口发来的数据,就可以识别是不是内部端口了

  • selectotz 2017-05-26

    @1:可以在Events.php中OnMessage中知道是哪个worker执行的操作吗? 即拿到 workerId

  • walkor 2017-05-27

    需要什么信息传过去就好

年代过于久远,无法发表回答
🔝