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ā)心跳包也是會斷開連接?
斷開連接不一定是心跳導(dǎo)致的??赡軜I(yè)務(wù)哪里斷開了連接,這個(gè)需要你們自己具體分析。
如果想要測試框架的心跳設(shè)置,可以下載workerman-chat試下,避免因?yàn)闃I(yè)務(wù)代碼問題導(dǎo)致誤判。
另外更改完配置要restart才能生效,reload不生效。
作者大大你好,剛剛我本地?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,直接跳過了
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ā)心跳包即可咯