国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

Gateway異常退出問(wèn)題及解決方案

zzz

在項(xiàng)目運(yùn)行中遇到不定時(shí)出現(xiàn)這個(gè)問(wèn)題,目前已解決,問(wèn)題如下:
?Gateway.php:372

 if ($this->_workerConnections) {
    // 調(diào)用路由函數(shù),選擇一個(gè)worker把請(qǐng)求轉(zhuǎn)發(fā)給它
    /** @var TcpConnection $worker_connection */
    $worker_connection = call_user_func($this->router, $this->_workerConnections, $connection, $cmd, $body);
    if (false === $worker_connection->send($gateway_data)) {
        $msg = "SendBufferToWorker fail. May be the send buffer are overflow. See http://wiki.workerman.net/Error2";
        static::log($msg);
        return false;
    }
} 

// 沒(méi)有可用的 worker此時(shí)判斷了$this->_workerConnections是否為真,如果為真就去調(diào)用了路由函數(shù)
?
如果此時(shí)reload,用戶(hù)有多個(gè)worker進(jìn)程,并且自定義了路由,需要把用戶(hù)路由到特定worker進(jìn)程
?
那么此時(shí)在$this->_workerConnections中很有可能不是全部已啟動(dòng)好的worker

其中可能因?yàn)樾枰獁orker進(jìn)程未加載完成,所以并不包含需要的worker進(jìn)程?

這時(shí)就有可能會(huì)出現(xiàn)一個(gè)致命錯(cuò)誤:null調(diào)用了不存在的方法send()
?
因此需要修改一下這個(gè)判斷是否有可用worker的if判斷:

if ($this->_workerConnections) {
    // 調(diào)用路由函數(shù),選擇一個(gè)worker把請(qǐng)求轉(zhuǎn)發(fā)給它
    /** @var TcpConnection $worker_connection */
    $worker_connection = call_user_func($this->router, $this->_workerConnections, $connection, $cmd, $body);
    if (!$worker_connection) {
        do {
            $worker_connection = call_user_func($this->router, $this->_workerConnections, $connection, $cmd, $body);
        } while(!$worker_connection);
    }
    if (false === $worker_connection->send($gateway_data)) {
        $msg = "SendBufferToWorker fail. May be the send buffer are overflow. See http://wiki.workerman.net/Error2";
        static::log($msg);
        return false;
    }
} 

// 沒(méi)有可用的 worker麻煩walkor看看,希望在框架中修復(fù),這樣我們就不用侵入去修改框架的代碼,造成后續(xù)git更新框架的困擾

3989 2 0
2個(gè)回答

walkor 打賞

感謝你的建議,

if (!$worker_connection) {
    do {
        $worker_connection = call_user_func($this->router, $this->_workerConnections, $connection, $cmd, $body);
    } while(!$worker_connection);
}

不過(guò)這個(gè)代碼無(wú)法解決你說(shuō)的這個(gè)問(wèn)題。原因是進(jìn)程執(zhí)行在這個(gè)死循環(huán)時(shí),這些參數(shù) $this->router, $this->_workerConnections, $connection, $cmd, $body是不變的,尤其是$this->_workerConnections不會(huì)有變化,這會(huì)導(dǎo)致gateway進(jìn)程cpu100%,導(dǎo)致服務(wù)永遠(yuǎn)無(wú)法使用。
?
框架能優(yōu)化的只能是判斷下?$worker_connection 是否為空,如果為空就不調(diào)用send,并記錄一個(gè)日志。
?
?

  • 暫無(wú)評(píng)論
zzz

謝謝回復(fù),那是否能將發(fā)送失敗的消息放入一個(gè)隊(duì)列,后續(xù)按一定的重試次數(shù)重試發(fā)送,如果重試成功或者重試失敗一定次數(shù)就移除消息呢

  • walkor 2019-07-19

    可以的,你們可以自己加個(gè)

年代過(guò)于久遠(yuǎn),無(wú)法發(fā)表回答
??