关于GatewayWorker框架中,多个gateway,businessworker中,不同gateway客户端如何通信疑惑?

frank

背景(gatewayWorker框架):
有两台gateway服务器,分别为gateway_1, gateway_2
两台businesswork服务器,分别为businesswork_1, businesswork_2
假设有4个客户端,c1, c2, c3, c4,其中 c1和c2连接到gateway_1上, c3和c4连接到gateway_2上
并且c1, c2, c3, c4为同一个分组,如下所示

[attach]2150[/attach]

 
 
问题1:
c1给c4发送消息,在gatewayWorker内部是如何实现的?看了手册,自己理解为如下流程:
c1----->gateway_1转发消息---------->businessWorker_1处理完业务-------------->gateway_2转发消息------------>c4
相当于在businessWorker_1处理完后,通过businessWorker_1和gateway_2已经建立好的TCP连接来转发数据,内部有什么机制吗?
 
问题2:
c1, c2, c3, c4是一组,如果给这个组广播消息,内部是如何实现的呢?
 
看了gatewayWorker框架源代码,还是不太明白,求教各位

3284 1 0
1个回答

phpcreeper

1、首先 c1----->gateway_1转发消息 ---------> 【这里不一定是businessWorker_1处理处理业务,因为这里内置默认是随机的worker路由选择策略】
2、假设是businessWorker_1处理消息 -------> gateway_2转发消息------------>c4 , 根据图示实际例子, 这里的原理就是:
(1)无论是站在gateway侧,还是businessworker侧来看,总共维持了  2 * 2 = 4 个tcp 连接;
(2)关键就在于 businessWorker_1 会通过gateway_2 这条通道将消息转发给c4,因为c4对应的client_id 是由 gateway_local_ip + gateway_local_port + connection_id 唯一确定的;
3、至于组内广播原理大致是:
(1)首先理解了上面那个原理,组播或广播就不难理解了;
(2)每个gateway进程都会维护一个相应的数组结构,该数组保存了加入到当前组的所有客户端对象;
(3)当组播或广播时,每个gateway进程内逆向遍历出对应的客户端对象,进而实现数据的转发;

  • frank 2019-06-11

    感谢细心的回复,
    1.c1---->gateway网关确实是随机的,源代码是通过array_rand()随机获取一台gateway,上面情况是假设到gateway_1

    1. 嗯,这点是明白了,从源码中看到,每个客户端和gateway建立连接时,会封装一个gatewayHead对象,记录了这个client是和哪个gateway建立连接的,并通过_allConnections[connection_id]=gatewayHead存储,方便识别接收连接是和哪个gateway连接,确定转发路线。
      3.组内广播还是有一个疑问,gateway_1和gateway_2为两台单独服务器,gateway_1和gateway_2服务器维持各自的客户端,现在需要给c1,c2,c3,c4广播消息,我理解的流程如下;
      1) gateway_1 循环遍历该分组数组中所有客户端,假设其中c1----->bussinessWorker_1,
      2) 在businessWorker_1中omGatewayMessage中根据消息类型,如果是group_broadcast类型即广播,直接转到和bussinessWorker_1有建立连接的所有gateway,此处只有gateway_2, 在gateway_2中获取指定分组所有client, 进行转发。
  • phpcreeper 2019-06-11

    没错,组播或广播的流程细节大致就是你描述的那样:
    即每一个bussinessworker进程都做同样的工作去和每个gateway进程通信,然后每个gateway进程遍历当前维持的业务数组并路由出当前进程所维护的connection对象,然后各自独立完成数据的转发。

  • frank 2019-06-11

    感谢指导分享

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