$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));
};
}
當(dāng)前有5000+ ws鏈接,以上http端口調(diào)用“http://12。0.0.1:9191/?message=1&users=all” 后導(dǎo)致許多ws鏈接斷開,
請問大佬們需要怎么優(yōu)化?
是在壓測么?
客戶端是否有超時邏輯?比如發(fā)送數(shù)據(jù)后要求多少秒內(nèi)需要回應(yīng)否則斷開這種邏輯。如果5000個客戶端同時發(fā)請求到服務(wù)端,服務(wù)端處理不過來(尤其有數(shù)據(jù)庫)可能會導(dǎo)致響應(yīng)超時,導(dǎo)致客戶端斷開。
這5000客戶端收到服務(wù)端的sendToAll的數(shù)據(jù)后會向服務(wù)端發(fā)請求?
建議客戶端收到sendToAll的數(shù)據(jù)后不要向服務(wù)端發(fā)送數(shù)據(jù),至少不要發(fā)送帶有IO操作的請求數(shù)據(jù),正式環(huán)境這樣搞其實(shí)和DDOS自己的服務(wù)器差不多效果。服務(wù)端處理不過來導(dǎo)致業(yè)務(wù)延遲,導(dǎo)致連接斷開。
busy的原因是businessworker收到了大量的請求需要處理,這些請求積壓在緩沖區(qū),需要一個一個處理,所以沒有辦法及時響應(yīng)status,顯示busy。兩個截圖Gateway請求量增加了10W+,這請求量不小,你要確認(rèn)下你的業(yè)務(wù)邏輯是否足夠快,數(shù)據(jù)庫是否能支撐這么大的請求量。尤其不要做sendToAll后客戶端向服務(wù)端發(fā)慢請求DDOS自己這種操作。
總體來說就是你的服務(wù)器配置支撐不了這么大的請求量,請求積壓了。想辦法減少請求量,想辦法加快請你去處理速度,包括減少數(shù)據(jù)庫包括Gateway接口的操作。
服務(wù)端接受到ws連接后存儲db數(shù)據(jù)信息
不要這么操作,你要考慮到服務(wù)重啟時上萬在線客戶端同時發(fā)起連接請求時,數(shù)據(jù)庫承受不住的。連接事件最好輕量。