首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
TCP 长连接场景,客户端很少,数据量非常大的情况,如何让请求负载到 worker,又能监听 disconnect 事件
dispatch_mode=1/3 时,底层会屏蔽 onConnect/onClose 事件,原因是这 2 种模式下无法保证 onConnect/onClose/onReceive 的顺序。那岂不是无法在客户端很少的情况下负载请求了。
发布于5年前 · 4 次浏览 · 来自
提问
hans941
dispatch_mode=1/3 时,底层会屏蔽 onConnect/onClose 事件,原因是这 2 种模式下无法保证 onConnect/onClose/onReceive 的顺序。那岂不是无法在客户端很少的情况下负载请求了。
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2021-04-21
郭新华
确实有你说这种问题,建议使用默认的dispatch_mode =2 ,然后减少worker进程,采用纯异步协程 或者 试试用dispatch_func
赞
2
回复
2021-04-21
郭新华
补充一下,纯协程的服务不需要开太多worker,和cpu核数一样即可
赞
1
回复
2021-04-21
hans941
我所面临的场景下,客户端可能自有两三个,服务核心数有几十个,并且存在较多的 swoole_table 和复杂的递归pack unpack组包解包操作,qps一万以上时,很容易一个cpu核心就吃满了。所以 dispatch_mode 2肯是不行的。 其实可以用自定义应用层心跳包检测代替 onClose 事件,但实时性就比较低了。 经过郭大佬的提醒,dispatch_func 下竟然是可以触发 onClose 事件的,有些意外,不过问题是迎刃而解了。 感谢郭大佬的回答。 ```php [ 'dispatch_func' => function ($server, $fd, $type, $data) { return random_int(0, S_WORKER_NUMBER - 1); } ] ```
赞
0
回复
2021-04-22
hans941
``` enable_unsafe_event 启用 onConnect/onClose 事件。【默认值:false】 Swoole 在配置 dispatch_mode=1 或 3 后,因为系统无法保证 onConnect/onReceive/onClose 的顺序,默认关闭了 onConnect/onClose 事件; 如果应用程序需要 onConnect/onClose 事件,并且能接受顺序问题可能带来的安全风险,可以通过设置 enable_unsafe_event 为 true,启用 onConnect/onClose 事件。 discard_timeout_request 丢弃已关闭链接的数据请求。【默认值:true】 Swoole 在配置 dispatch_mode=1 或 3 后,系统无法保证 onConnect/onReceive/onClose 的顺序,因此可能会有一些请求数据在连接关闭后,才能到达 Worker 进程。 提示 discard_timeout_request 配置默认为 true,表示如果 worker 进程收到了已关闭连接的数据请求,将自动丢弃。 discard_timeout_request 如果设置为 false,表示无论连接是否关闭 Worker 进程都会处理数据请求。 enable_reuse_port ``` 补充下,之前没看到这个配置。
赞
0
回复