Gdb看了一下core 也搞不清哪里的问题。php版本是7.2.11 使用了kafka扩展,memcache和memcached扩展,linux已调优。
追问一个问题,如果有某一个客户端数据量很大,就算reusePort为true也不会平均分配给各个BusinessWorker,只会一直分配给一个进程,对么? 如果业务中有数据库操作,很可能出现busy的情况,是不是只能在开一个服务异步去处理,才能解决这类busy的问题。还是有更好的处理方法,谢谢~~~~
coredump 一般都是某个php扩展的bug,或者某个php版本的bug。
reusePort 为true 会平均分配连接给进程,并不会把连接上的请求分散到各个进程。 gateway将消息转发给businessWorker的路由默认规则是: Gateway随机选择一个BusinessWorker进程,然后把当前client_id与这个BusinessWorker进程绑定,以后这个client_id的所有数据(onConnect/onMessage/onClose事件)都交给这个绑定的BusinessWorker进程处理。你可以自己改成随机分发给各个BusinessWorker进程。具体参考手册路由部分 http://doc2.workerman.net/router.html
如果是随机路由的话,同一个客户端的消息及事件处理可能会出现乱序,因为多个businessWorker进程处理消息是并行的,并不容易保证顺序,也不能保证哪个消息或者事件先处理完再处理下一个。
关于阻塞问题,不建议将复杂的业务逻辑写在GatewayWorker框架里。最好将gatewayWorker当作一个推送通道。在需要推送消息的时候调用。其它业务逻辑走其它框架。 参考手册 http://doc2.workerman.net/work-with-other-frameworks.html
非常感谢。
coredump 一般都是某个php扩展的bug,或者某个php版本的bug。
reusePort 为true 会平均分配连接给进程,并不会把连接上的请求分散到各个进程。
gateway将消息转发给businessWorker的路由默认规则是:
Gateway随机选择一个BusinessWorker进程,然后把当前client_id与这个BusinessWorker进程绑定,以后这个client_id的所有数据(onConnect/onMessage/onClose事件)都交给这个绑定的BusinessWorker进程处理。你可以自己改成随机分发给各个BusinessWorker进程。具体参考手册路由部分 http://doc2.workerman.net/router.html
如果是随机路由的话,同一个客户端的消息及事件处理可能会出现乱序,因为多个businessWorker进程处理消息是并行的,并不容易保证顺序,也不能保证哪个消息或者事件先处理完再处理下一个。
关于阻塞问题,不建议将复杂的业务逻辑写在GatewayWorker框架里。最好将gatewayWorker当作一个推送通道。在需要推送消息的时候调用。其它业务逻辑走其它框架。
参考手册 http://doc2.workerman.net/work-with-other-frameworks.html
非常感谢。