如果workerman实现分布式处理

DY

如果workerman实现分布式处理,是不是需要通过socket进行多台服务器的通讯,那么这个socket的通讯模式,和fastcgi相比,好在什么地方?

5721 8 0
8个回答

walkor

workerman分布式不一定要多台服务器间socket通讯,看具体应用,例如短链接类的WEB应用,就不用服务器间通讯。fastcgi是一种协议,和分布式没有必然联系,我也不知道怎么和workerman来比较。

  • 暂无评论
DY

嗯,目标需求是一个游戏服务器

需要用3台Server对游戏的逻辑进行处理

一台Gateway,进行连接管理。

那如果Gateway向Server发送处理请求,是不是必然需要通过Socket进行通讯。

还是通过共享内存,大家都去访问一个memcache机器之类的部署方式。

因为FastCGI是基于Socket的一种模式,所以Gateway只需要设置好要请求FastCGI网关地址,然后进行轮训请求就可以达到效果。

所以想问一下,如果是Worekerman,该怎么处理?

  • 暂无评论
walkor

workerman中 Gateway和BusinessWorker之间的通讯是TCP长链接通讯。而FastCGI一般用于短链接通讯,使用FastCGI会有频繁的创建链接TCP三次握手和断开链接TCP四次握手的通讯过程,导致服务器网络IO及CPU负载都会高一些,而且在创建链接时也会造成请求的等待,影响通讯的即时性。另外FastCGI协议比较复杂,解析起来也比较耗费CPU,FastCGI更适合WEB类的应用。相比workerman的协议是自己订制的,简单高效。

  • 暂无评论
DY

哦,那我明白了

workerman里

Gateway会跟N台服务器的BusinessWorker进行长连接通信,从而实现分布式,是这个意思吧?

  • 暂无评论
walkor

对的。
而且Gateway与BusinessWorker之间是自动感知的,你加一台BussnessWorker或者下掉一台BusinessWorker,Gateway都会自动感知,不用配置Gateway,非常方便。

  • 暂无评论
DY

哦?这个自动感知是扫描端口监听么?

  • 暂无评论
ayamzh

老大。你所说的自动感知机制。的相关代码在哪,怎么实现

  • 暂无评论
walkor

BusinessWorker进程启动的时候会自动读取一个存储,这个存储中保存着所有Gateway进程内部通讯的ip和端口,然后BusinessWorker与这些ip端口建立长链接,这时Gateway会自动感知到有新的BusinessWorker加进来,以后有客户端请求到来时会自动将请求按照规则(目前是随机或者说是轮询)发送到新加的BusinessWorker。

当下掉一台BusinessWorker时,这台BusinessWorker与Gateway的长链接会断开,Gateway此时也会感知到,然后Gateway将断开的长链接从自己与BusinessWorker的长连接池中去掉,就不会向下掉的BusinessWorker转发客户端请求了。

原理就是这样,代码见 Bootstrap/Gateway.php Bootstrap/BusienessWorker.php

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