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