多台gateway之间的通讯原理是什么?

0

我想通过LVS负载均衡实现多台gateway来满足高并发,如果LVS把用户A连接到了gateway1,用户B连接到了gateway2,两个用户不在一个gateway下面,这两个用户如何互相发送数据?实现原理是什么呢?盼回复。

已邀请:

walkor

赞同来自:

workerman启动过程:
workermangateway/worker模型中有两种进程,gateway进程(负责异步网络IO)和worker进程(负责业务逻辑)。wokerman启动时会启动gateway进程和worker进程,gateway进程启动时会向一个存储(文件或者memcache,可配置)写入每个gateway进程的内部通讯地址,worker进程启动时会读取存储,并向每个geteway内部通讯地址建立起长连接。同时worker进程中会有个定时任务,定时监测存储中是否有新的gateway内部通讯地址加入,有的话同样建立长连接(这样增加workerman服务器就会自动探测到,新的gateway、worker进程就会加入集群)。gateway和worker之间的通讯就是靠内部的长连接通讯的,每个gateway进程会和后端所有worker进程有一个长连接,每个gateway进程都知道有多少worker进程,每个worker进程也知道有哪些gateway进程。


广播和单独发送
发送数据分为两种,一种是广播(给所有在线客户端发),另外一种是单独给某客户端发送。


广播:
广播比较好实现,当某个客户端要广播数据时,worker进程中调用Gateway::sendToAll($message)即可。这时worker进程会向所有gateway进程通过已经建立的长连接发送一条广播命令+数据,每个gateway进程都会收到这个命令+数据,向gateway进程自己所维护的所有客户端连接发送数据(异步)。


单独发送:
单独发送调用Gateway::sendToClient($client_id, $message);。也就是说单独发送需要得到对方的client_id。workerman发送向client_id发送数据时,需要通过client_id获得到client_id对应的gateway内部通信地址,而这个地址是在每个客户端连接gateway时就存储了的(文件或者memcache,可配置),通过这个存储得知gateway内部通讯地址后,向这个地址发送命令+数据,对应gateway进程收到命令+数据后找到对应的客户端socket发送数据即可。

要回复问题请先登录注册