dispatch_mode

最后更新于:2022-04-02 06:21:49

# dispatch\_mode [TOC] 数据包分发策略。可以选择`7`种类型,默认为`2` * 1,轮循模式,收到会轮循分配给每一个`Worker`进程 * 2,固定模式,根据连接的文件描述符分配`Worker`。这样可以保证同一个连接发来的数据只会被同一个`Worker`处理 * 3,抢占模式,主进程会根据`Worker`的忙闲状态选择投递,只会投递给处于闲置状态的`Worker` * 4,IP分配,根据客户端`IP`进行取模`hash`,分配给一个固定的`Worker`进程。可以保证同一个来源IP的连接数据总会被分配到同一个`Worker`进程。算法为`ip2long(ClientIP) % worker_num` * 5,`UID`分配,需要用户代码中调用[Server->bind()](Server-bind.md)将一个连接绑定`1`个`uid`。然后底层根据`UID`的值分配到不同的`Worker`进程。算法为`UID % worker_num`,如果需要使用字符串作为UID,可以使用`crc32(UID_STRING)` * 7,`stream`模式,空闲的`Worker`会`accept`连接,并接受`Reactor`的新请求 ## 使用建议 * 无状态`Server`可以使用`1`或`3`,同步阻塞`Server`使用`3`,异步非阻塞`Server`使用`1` * 有状态使用`2`、`4`、`5` > `dispatch_mode 4,5`两种模式,在`1.7.8`以上版本可用 > `dispatch_mode=1/3`时,底层会屏蔽`onConnect`/`onClose`事件,原因是这2种模式下无法保证`onConnect`/`onClose`/`onReceive`的顺序 > 非请求响应式的服务器程序,请不要使用模式1或3 ## UDP协议 * `dispatch_mode=2/4/5`时为固定分配,底层使用客户端IP取模散列到不同的`Worker`进程,算法为`ip2long(ClientIP) % worker_num` * `dispatch_mode=1/3`时随机分配到不同的`Worker`进程 ## BASE模式 `dispatch_mode`配置在`BASE`模式是无效的,因为`BASE`不存在投递任务,当`Reactor线程`收到客户端发来的数据后会立即在当前线程/进程回调`onReceive`,不需要投递`Worker`进程。
';