gateworkerman 流程问题

oldtwo

截图
这个图 有些地方没有看懂 就是 worker 进程 是怎么从多个gateway里面选择一个 转发给客户端的
gateway进程 又是怎么从多个worker里面选择一个来处理的 追源码的时候没有看见这里面的流程
可以用worker进程 从多个gateway 进程选择选择一个说明一下。

1097 1 0
1个回答

phpcreeper

题外话
大大的源码里注释相当人性化了,而且好多地方还都是中文注释呢,那么明显的实现说看不见不合理呀,只能说还是你源码看的多少粗暴。

首先建议把官方手册介绍的原理先熟读一遍,然后咱们分享细节
https://www.workerman.net/doc/gateway-worker/principle.html

上面的工作做好了,且为了方便表述问题,我们做如下上下文设定

  1. 我们选定研究对象: client-7客户端, gateway-2进程, worker-3进程
  2. 我们设定研究worker进程只返回数据给client-7客户端

先说client和gateway通信

  1. client-7发起连接,此时所有的gateway进程受内核调度遴选出gateway-2进程处理客户端连接;
  2. gateway-2进程会从worker进程(向gateway-2进程)发起的所有连接中随机的选出一个连接,然后发给我们设定的随机worker-3进程; 注意: 一旦第一次随机命中了,之后再收发数据的话,那还是往这个worker-3上发,不过要想自主决定由哪个worker来处理也是可以的, 方案就是定制Worer::$router回调
  3. gateway-2进程会将client-7的client_id转发给worker-2进程,重点来了: client_id中包含了内部IP、端口以及客户端连接ID等重要的凭证数据,换句话这三个因子决定了client_id的唯一性
  4. 还是提一下: 每个gateway进程在启动以后,都会开启一个相应的内部监听端口;

再来说一下gateway和worker通信
当worker进程返回数据给设定的客户端时【其实是events代理帮干的】,会根据client_id反解出相应的gateway进程的内部IP、端口, 这样worker-3进程自然就知道该连接哪个gateway进程了,这里自然就是我们设定的gateway-2进程。

  • liziyu 2022-05-12

    👍

  • oldtwo 2022-05-13

    1 client-7发起连接,此时所有的gateway进程受内核调度遴选出gateway-2进程处理客户端连接; 这个第一步 不是workerman 实现的吗? 怎么变成内核调度选出gateway-2

  • phpcreeper 2022-05-13

    workerman实现了多进程模型以及网络IO管理,但是到底由哪个进程来处理哪个TCP连接,workerman没有调度权【不要忘了一开始的上下文设定,若非要举一种特例:那就是在多worker+单进程模式下,开发者还是有权决定让哪个进程来处理哪个连接,其实想想只不过是路由到不同的端口,然后交给唯一的一个子进程处理而已,只有一个子进程干活还用遴选吗?所以仅仅是一种特例而已】

  • oldtwo 2022-05-13

    再来说一下gateway和worker通信, 那gateway与worker通信, 从多个worker 里面选择一个 也是内核调度的吗

  • phpcreeper 2022-05-13

    这种情形当然是可以从业务层面调度的【我们也知道gatewayworker框架已经帮代劳了】,但是它和上面描述的情况根本就不是一码事,因为此时选择哪个worker来处理是建立在先前worker已经连接到gateway基础之上这个大背景下的,但是反方向过来那就又变成了只能是内核调度,要理解这微妙的区别,必须先把谁是客户端,谁是服务端的相对角色厘清,因为全双工的不同方向通信手段是不尽相同的。

  • oldtwo 2022-05-13

    嗯 基本上懂了 我们选定研究对象: client-7客户端, gateway-2进程, worker-3进程 返回时候 也是woker-3 返回到gate-way2 吧 不会换一个gateway 进程吧

  • phpcreeper 2022-05-13

    是滴,按照默认路由模型,这样就对了

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