2016-07-07 2 views
0

Ich verwende https://github.com/google/go-gcm, um Push-Benachrichtigungen von unserem Go-Backend an Android-Geräte zu senden. Vor kurzem begann diese Push-Benachrichtigungen scheitern, weil der Anruf an SendXmpp() wurde mit dem folgenden Fehler zurückgegeben:Korrekte Fehlerbehandlung beim Senden einer XMPP-Push-Benachrichtigung mit go-gcm?

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

Neustarten den Go Prozess, genannt SendXmpp() diese Fehler weggeht macht, und Push-Benachrichtigungen wieder anfangen zu arbeiten. Aber natürlich ist das Neustarten des Go-Prozesses nicht ideal. Gibt es etwas, was ich explizit tun kann, um diese Art von Fehlern zu behandeln? Zum Beispiel, sollte ich den aktuellen XmppClient schließen und erneut versuchen, die Nachricht zu senden, damit die Wiederholung einen neuen XmppClient instanziiert und eine neue Verbindung öffnet?

Antwort

0

Ich würde empfehlen, eine (exponentielle) Backoff zu verwenden oder zu implementieren. Es gibt eine Reihe von Optionen auf GitHub hier; https://github.com/search?utf8=%E2%9C%93&q=go+backoff obwohl das ist sicherlich keine umfassende Liste und es ist nicht sehr schwer zu implementieren.

Die Grundidee ist, dass Sie die Funktion, die Sie aufrufen möchten, an die Backoff-Funktion übergeben, die sie aufruft, bis sie ein maximales Fehlerlimit erreicht oder erfolgreich ist. Zwischen jedem Fehler wird die Wartezeit erhöht. Wenn Sie einen Server hämmern und Fehler verursachen, löst eine solche Methode in der Regel Ihre Probleme und macht Ihre Anwendung zuverlässiger.

Darüber hinaus würde ich empfehlen, nach einer suchen, die eine Abbruchfunktion hat. Dies kann relativ einfach in Go implementiert werden, indem ein Kanal in die Backoff-Funktion (mit der Funktion, die Sie anrufen möchten) übergeben wird. Dann, wenn Ihre App anhalten muss, können Sie auf dem Abort-Kanal signalisieren, dass der Back-Off nicht mit 300 Sekunden warten muss.

Auch wenn dies Ihr spezifisches Problem nicht löst, hat dies im Allgemeinen einen positiven Effekt auf die Zuverlässigkeit Ihrer Apps und die APIs von Drittanbietern, mit denen Sie interagieren (nicht Ihre Partner DOS).