RT,開發(fā)了幾個接口,發(fā)現(xiàn)別人給的協(xié)議都是定時發(fā)送心跳,而且不論是否有數(shù)據(jù)傳輸,都要定時發(fā)送,否則就會斷開,gatewayworker的心跳有接收數(shù)據(jù)就不會發(fā)送,建議,增加一個開關(guān),強制發(fā)送心跳開關(guān)。
這樣對于自己內(nèi)部開發(fā)的接口,可以有數(shù)據(jù)就不發(fā)送心跳,對于別的自己不能控制協(xié)議的接口,可以開起強制發(fā)送心跳。
我現(xiàn)在的情況是我這邊作為客戶端,對方是服務(wù)端,協(xié)議是對方定的,我為了方便收發(fā)數(shù)據(jù),用AsyncTCPconnection 做了兩個連接,一個連接到gateway的一個端口中作為客戶端,另一個連接對方的端口作為客戶端,這樣數(shù)據(jù)用pipe就可以把對方模擬成我的gateway的一個客戶端了,這樣收發(fā)數(shù)據(jù)就方便統(tǒng)一了,擔是對方對這個心跳要求是定時30秒的,我這邊發(fā)LifeSignRequest,對方回復(fù)LifeSignResponse。
gateway推薦客戶端發(fā)送心跳。服務(wù)端發(fā)送心跳其實主要是為了檢測死鏈接,也就是一些連接被網(wǎng)關(guān)或者路由清理了或者對端斷網(wǎng)斷電等極端情況,能及時知道并清理,避免死連接不斷累積導(dǎo)致內(nèi)存泄漏。對方服務(wù)端在gateway看來是一個客戶端,心跳應(yīng)該客戶端發(fā)來才合理。如果對方服務(wù)端不支持定時給對端發(fā)送心跳,可以把gateway心跳間隔小一點,保證在30秒內(nèi)有數(shù)據(jù)通訊就行了。
本來我這邊應(yīng)該是客戶端,對方是服務(wù)端,我為了和別的接口一樣收發(fā)統(tǒng)一,用兩個AsyncTCPconnection 連接然后pipe,來把對方模擬成gateway的服務(wù)端,這樣就可以把所有的接口一樣的對待。但對方是要求這邊定時發(fā)心跳數(shù)據(jù)的,不管有沒有數(shù)據(jù),如果一分鐘沒有心跳,對方就斷開連接。我這邊別人給的幾個協(xié)議,只要是長連接的,都是這樣,不管有沒有數(shù)據(jù),都要發(fā)心跳。我們自己的設(shè)備的我可以讓同事改,但是別人的就真做不了要求,因為對方不只和我們一家通訊。