关于gateway里的worker多进程的疑惑的问题

testqkl

大致都浏览了好几次文档了,有几个疑惑:
看了文档里实例里worker的count都是设置成4,问题来了,那么一个多websocket客户端连接到服务器肯定是会按一定规律分配给不同的worker,多进程间数据是无法共享的,那么广播群发,workerman怎么处理的,利用了什么机制,内存数据共享机制吗? 我看了下大致的源码,找到一个gateway类里有一个_clientConnections,不明白这个是怎么共享的,而且gateway也是有count设置成4个进程的,不解

3908 3 0
3个回答

mdx2007

之前看了下workerman源码,没看到有共享内存操作的代码。也就是进程间的数据不是共享的。
如果业务要共享数据用redis mysql会好一些。

看gateway源码是利用了进程间通讯来做到多进程广播数据的。businessWorker和每个gateway都有内部连接,要广播时直接给每个gateway内部连接发个消息就好了,如果是给某个连接发消息,只需要给对应的gateway内部连接发消息就好了。businessWorker和每个gateway都是tcp socket相连的,我感觉用unix socket性能可能会更好一些,不知道作者为啥选了tcp socket。

  • 暂无评论
maq

简单说,在 GatewayWorker 框架下,存在多个 Gateway 实例和多个 BusinessWorker 实例,在 Register 的协调下,Gateway 知道所有的 BusinessWorker,BusinessWorker 也知道所有的 Gateway。

Gateway 收到客户的请求时,挑一个 BusinessWorker 来处理,并回传处理结果。

BusinessWorker 如果有组播或者广播的需求,就通知所有的 Gateway 一起干。

  • 暂无评论
testqkl

感谢楼上的解答,又自己看了几遍文档,大致有些理解了

  • 暂无评论
年代过于久远,无法发表回答
🔝