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

GatewayWorker沒有按照預(yù)期斷開連接導(dǎo)致客戶端重連問題

binzhizhu

pingNotResponseLimit = 1
pingInterval = 60

60s內(nèi)如果客戶端沒有發(fā)送任何數(shù)據(jù),服務(wù)端則斷開客戶端連接

客戶端已經(jīng)做了重連策略,而且是每30s會發(fā)送一次心跳包到服務(wù)端,我看了一下Gateway的重連策略代碼,大致的意思如下:

GatewayWorker進(jìn)程啟動的時(shí)候呢,如果有要求重連則設(shè)置一個(gè)定時(shí)器定期去檢測客戶端連接的心跳,如果在心跳檢測時(shí)間內(nèi)客戶端有互動,則pingNotResponseCount=-1,否則pingNotResponseCount++,如果上次發(fā)送的心跳還沒有回復(fù)次數(shù)大于限定值就斷開

但是這樣配置服務(wù)端還是會定時(shí)斷開連接,不太明白,也就是說客戶端一定要自己做重連策略了是嗎?僅僅是定期發(fā)心跳包也是會斷開連接?

3686 3 0
3個(gè)回答

walkor 打賞

斷開連接不一定是心跳導(dǎo)致的??赡軜I(yè)務(wù)哪里斷開了連接,這個(gè)需要你們自己具體分析。

如果想要測試框架的心跳設(shè)置,可以下載workerman-chat試下,避免因?yàn)闃I(yè)務(wù)代碼問題導(dǎo)致誤判。

另外更改完配置要restart才能生效,reload不生效。

  • binzhizhu 2021-03-17

    作者大大你好,剛剛我本地?cái)帱c(diǎn)調(diào)試打印了一下,有一處實(shí)現(xiàn)不是很明白:

    我現(xiàn)在客戶端的重連策略是這樣的:

    var heartCheck = {
        timeout: 30 * 1000,
        timer: null,
        serverTimer: null,
        reset: function () {
            this.timer && clearTimeout(this.timer);
            this.serverTimer && clearTimeout(this.serverTimer);
        },
        start: function (ws) {
            console.info('heartCheck start',new Date());
            var that = this;
            this.reset();
            this.timer = setTimeout(function () {
                // console.log('發(fā)送心跳,后端收到后,返回一個(gè)心跳消息')
                // onmessage拿到返回的心跳就說明連接正常
                ws.send(JSON.stringify({heart: 1}))
                that.serverTimer = setTimeout(function () {
                    // 如果超過一定時(shí)間還沒響應(yīng)(響應(yīng)后觸發(fā)重置),說明后端斷開了
                    ws.close()
                }, that.timeout)
            }, that.timeout)
        }
    };

    websocket連接成功、或者接受到服務(wù)端消息都會調(diào)用heartCheck.start重置一下,也就相當(dāng)于如果在指定的心跳時(shí)間內(nèi)如果服務(wù)端沒有發(fā)送ACK心跳包給客戶端,客戶端也會自己斷開。

        if ($ping_data) {
                    if ($connection->pingNotResponseCount === 0 ||
                        ($this->pingNotResponseLimit > 0 && $connection->pingNotResponseCount % 2 === 1)
                    ) {
                        continue;
                    }
                    $connection->send($ping_data, $raw);
                }

    這個(gè)GatewayWorker代碼,pingNotResponseCount其實(shí)按照我的配置,如果是正常的情況應(yīng)該一直都是0,因?yàn)榻邮艿较刂?1,不會斷開的話就會+1,然后如果我配置了ping_data,上面那個(gè)if就會直接跳過了,因?yàn)榇丝蘰ingNotResponseCount=0,所以服務(wù)端那時(shí)候沒有發(fā)送ping_data給客戶端,我這邊客戶端直接斷了。

    其實(shí)不應(yīng)該會發(fā)送ping_data的嗎 ,現(xiàn)在是pingNotResponseCount=0,直接跳過了

binzhizhu

截圖

其實(shí)期望服務(wù)端也要回應(yīng)客戶端ping_data,但是并沒有,主要就是pingNotResponseCount 問題

  • 暫無評論
binzhizhu

http://doc2.workerman.net/heartbeat.html

我看了下心跳機(jī)制,是如果要求客戶端必須發(fā)送心跳包,服務(wù)端就不會發(fā)送ping_data嗎?因?yàn)閜ingNotResponseLimit >=1的時(shí)候 服務(wù)端沒有下發(fā)ping_data。那這樣的話,相當(dāng)于服務(wù)端跟客戶端自己協(xié)調(diào)一種方案了,如果說因?yàn)閜ingNotResponseLimit=1,只要確??蛻舳藭〞r(shí)發(fā)心跳包即可咯

  • walkor 2021-03-17

    一般不需要2端都發(fā)心跳,一端發(fā)就行。建議客戶端發(fā)

  • binzhizhu 2021-03-17

    @1: 好的

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