我正在使用https://github.com/google/go-gcm从我们的Go后端向Android设备发送推送通知。最近,这些推送通知开始失败,因为SendXmpp()
的调用返回时出现以下错误:
write tcp <IP>:<port>-><IP>:<port>: write: connection timed out
重新启动调用SendXmpp()
的Go进程会使此错误消失,并且推送通知会再次开始工作。但当然,重启Go过程并不理想。我能明确地做些什么来处理这种错误吗?例如,我应该关闭当前的XmppClient并重试发送消息,以便重试实例化一个新的XmppClient并打开一个新连接吗?
答案 0 :(得分:0)
我建议使用或实现(指数)退避。 GitHub上有很多选项; https://github.com/search?utf8=%E2%9C%93&q=go+backoff虽然这肯定不是一个全面的清单,但实施起来并不是非常困难。
基本思路是将您要调用的函数传递给后退函数,该函数调用它直到达到最大失败限制或成功。在每次失败之间等待的时间量增加。如果您正在锤击服务器,导致它返回错误,这样的方法通常可以解决您的问题并使您的应用程序更可靠。
此外,我建议寻找具有中止功能的一个。这可以通过将通道传递到退避功能(使用您要调用的功能)在Go中相当容易地实现。然后,如果您的应用程序需要停止,您可以在中止通道上发出信号,以便后退不会像300秒等待那样坐在那里。
即使这不能解决您的具体问题,它通常也会对您的应用程序可靠性和您与之交互的第三方API产生积极影响(不希望DOS为您的合作伙伴)。