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`进程。
';