Gateway worker sendToAll()导致许多ws链接断开

小W
 $worker = new BusinessWorker();
 $worker->name = 'Business_Server';
 $worker->count = 4;

Events.php

 if($businessWorker->id == 0){
        $inner_http_worker = new Worker('http://0.0.0.0:9191');
        $inner_http_worker->onMessage = function(TcpConnection $http_connection,Request $data){
            Gateway::sendToAll(json_encode($data));
        };
 }

当前有5000+ ws链接,以上http端口调用“http://12。0.0.1:9191/?message=1&users=all” 后导致许多ws链接断开,
请问大佬们需要怎么优化?

1132 4 0
4个回答

walkor

运行 php start.php status
截图,截图截全

  • 暂无评论
小W

没有发送http请求前:

http请求:http://12。0.0.1:9191/?message=1&users=all 之后

都是busy

strace 其中一个pid:

  • 暂无评论
小W

是不是卡在数据库读写这一块了

  • 暂无评论
walkor

是在压测么?

客户端是否有超时逻辑?比如发送数据后要求多少秒内需要回应否则断开这种逻辑。如果5000个客户端同时发请求到服务端,服务端处理不过来(尤其有数据库)可能会导致响应超时,导致客户端断开。

这5000客户端收到服务端的sendToAll的数据后会向服务端发请求?
建议客户端收到sendToAll的数据后不要向服务端发送数据,至少不要发送带有IO操作的请求数据,正式环境这样搞其实和DDOS自己的服务器差不多效果。服务端处理不过来导致业务延迟,导致连接断开。

busy的原因是businessworker收到了大量的请求需要处理,这些请求积压在缓冲区,需要一个一个处理,所以没有办法及时响应status,显示busy。两个截图Gateway请求量增加了10W+,这请求量不小,你要确认下你的业务逻辑是否足够快,数据库是否能支撑这么大的请求量。尤其不要做sendToAll后客户端向服务端发慢请求DDOS自己这种操作。

  • 小W 2022-01-06
    1. 压测的客户端链接也在同一台服务器

    2.服务端接受到ws连接后存储db数据信息

    1. 服务端在接受到消息时,检查消息如果不在线也存储db
  • 小W 2022-01-06

    是不是因为这几点的原因?

  • walkor 2022-01-06

    总体来说就是你的服务器配置支撑不了这么大的请求量,请求积压了。想办法减少请求量,想办法加快请你去处理速度,包括减少数据库包括Gateway接口的操作。

    服务端接受到ws连接后存储db数据信息

    不要这么操作,你要考虑到服务重启时上万在线客户端同时发起连接请求时,数据库承受不住的。连接事件最好轻量。

  • 小W 2022-01-06

    好的,谢谢大佬

年代过于久远,无法发表回答
🔝