2016-07-07 69 views
0

我使用https://github.com/google/go-gcm從我們的Go後端向Android設備發送推送通知。最近,這些推送通知啓動失敗,因爲調用SendXmpp()與以下錯誤返回:使用go-gcm發送XMPP推送通知時是否正確處理錯誤?

write tcp <IP>:<port>-><IP>:<port>: write: connection timed out 

重啓轉到過程調用SendXmpp()使得這個錯誤消失,和推送通知重新開始工作。但是,當然,重新啓動Go流程並不理想。有什麼我可以明確地處理這種錯誤?例如,我應該關閉當前的XmppClient並重試發送消息,以便重試實例化一個新的XmppClient並打開一個新的連接?

回答

0

我會推薦使用或實施(指數)退避。 GitHub上有很多選項。 https://github.com/search?utf8=%E2%9C%93&q=go+backoff雖然這肯定不是一個全面的列表,並且實施起來並不難。

基本思路是將您想要調用的函數傳遞給後退函數,後者調用函數,直至達到最大失敗限制或成功。在每次故障之間,等待的時間量會增加。如果您正在錘擊服務器,導致它返回錯誤,像這樣的方法通常會解決您的問題並使您的應用程序更可靠。

此外,我會建議尋找一個具有中止功能。在Go中,通過將一個通道傳遞給退避函數(使用您想要調用的函數)可以很容易地實現這一點。然後,如果您的應用需要停止,您可以在中止通道上發信號,以便退避不會像300秒鐘等待。

即使這不能解決您的具體問題,它通常會對您的應用程序可靠性和您與之交互的第三方API(不想DOS對您的合作伙伴)產生積極影響。