如果workerman实现分布式处理

0

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

已邀请:

walkor

赞同来自:

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

DY - 研究PHP性能

赞同来自:

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


需要用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 - 研究PHP性能

赞同来自:

哦,那我明白了


workerman里


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

walkor

赞同来自:

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

DY - 研究PHP性能

赞同来自:

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

ayamzh

赞同来自:

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

walkor

赞同来自:

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


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


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

要回复问题请先登录注册