$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链接断开,
请问大佬们需要怎么优化?
运行
php start.php status
截图,截图截全
没有发送http请求前:
http请求:http://12。0.0.1:9191/?message=1&users=all 之后
都是busy
strace 其中一个pid:
是不是卡在数据库读写这一块了
是在压测么?
客户端是否有超时逻辑?比如发送数据后要求多少秒内需要回应否则断开这种逻辑。如果5000个客户端同时发请求到服务端,服务端处理不过来(尤其有数据库)可能会导致响应超时,导致客户端断开。
这5000客户端收到服务端的sendToAll的数据后会向服务端发请求?
建议客户端收到sendToAll的数据后不要向服务端发送数据,至少不要发送带有IO操作的请求数据,正式环境这样搞其实和DDOS自己的服务器差不多效果。服务端处理不过来导致业务延迟,导致连接断开。
busy的原因是businessworker收到了大量的请求需要处理,这些请求积压在缓冲区,需要一个一个处理,所以没有办法及时响应status,显示busy。两个截图Gateway请求量增加了10W+,这请求量不小,你要确认下你的业务逻辑是否足够快,数据库是否能支撑这么大的请求量。尤其不要做sendToAll后客户端向服务端发慢请求DDOS自己这种操作。
2.服务端接受到ws连接后存储db数据信息
是不是因为这几点的原因?
总体来说就是你的服务器配置支撑不了这么大的请求量,请求积压了。想办法减少请求量,想办法加快请你去处理速度,包括减少数据库包括Gateway接口的操作。
不要这么操作,你要考虑到服务重启时上万在线客户端同时发起连接请求时,数据库承受不住的。连接事件最好轻量。
好的,谢谢大佬