dispatch_mode

数据包分发策略。可以选择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() 将一个连接绑定1uid。然后底层根据UID的值分配到不同的Worker进程。算法为 UID % worker_num,如果需要使用字符串作为UID,可以使用crc32(UID_STRING)
  • 7,stream模式,空闲的Workeraccept连接,并接受Reactor的新请求

使用建议

  • 无状态Server可以使用13,同步阻塞Server使用3,异步非阻塞Server使用1
  • 有状态使用245

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进程。



  • KK

    建议UID不要限制为INT,很多情况下UID为STRING, crc32(UID_STRING)这个由SWOOLE完成更好。

  • 今生有你✅已认证了

    什么叫请求响应式服务器程序,百度也没看明白,小白一个

  • saving……

    @今生有你✅已认证 就是有返回 客户端需要recv的,那种只发不收的不能用1/3 ,会丢包和获取不到连接信息

  • 想知道不同的dispatch_mode在时间使用中,具体的区别提现在哪里?比如说onReceive的中,怎么决定使用哪一个worker进程来读写数据

  • 今生有你✅已认证了

    @saving 谢谢

  • 徐赞

    处理接口 可以设置 dispatch_mode=1吗?