2013-10-24 10 views
6

Ich habe App, die einige Vernetzung auf Benutzeraktivität basiert. Übliche Nutzlast, die von der App gesendet wird, beträgt 100-200 Bytes, also im Prinzip keine schweren Hebeaufgaben. Diese Aufgaben funktionieren normalerweise ohne Probleme (statistisch 99,9% oder Anfragen sind in Ordnung), aber abgesehen von diesen Netzwerkaktivitäten sendet meine App auch einen Herzschlag zurück an unsere Server (die auf Amazon EC2 (us-east1- d wenn das wichtig wäre)). Heartbeat wird alle 10 Sekunden als normale POST-Anforderung über HTTPS gesendet - und das funktioniert bei mir nicht wirklich, da die Ausfallrate viel höher ist als bei normalen Netzwerkaktivitäten - während meines letzten 7-stündigen Tests waren 25% der Heartbeat-Anfragen fehlgeschlagen (aber ich sah sogar 35% Tropfen) und es hält normalerweise in diesem Tempo. Wenn ich SSL deaktiviere, bleibt die Fehlerrate auf meinem Testgerät bei 8% Prozent. Dies wäre wahrscheinlich nicht so ein großes Problem, wenn diese Fehler in ein beliebiges Muster fallen würden (dh jedes 4. usw., was eine ratenbasierte Filterung bedeuten könnte oder fast jede volle Stunde oder jeden Tag fehlschlagen würde, was irgendwo eine Anforderungsbeschränkung bedeuten könnte)). Aber so etwas passiert nicht - manchmal können 10-15 Anfragen hintereinander fehlschlagen, und das ist schlecht für den Herzschlag. Zusätzlich, um die Sache noch schlimmer zu machen, sehe ich im Moment, dass Anfragen fehlschlagen, ich kann mich vom selben Gerät aus mit dem Server verbinden und das funktioniert ohne Probleme. Dieses Problem tritt bei jeder unterstützten Version von Android (2.2 und höher) auf.Probleme im Netzwerk "Stabilität" Problem Wurzeln

Ich benutze die letzten httpclientandroidlib, um die HTTP-Anfragen zu tun, so begann ich zu glauben, dass lib zu einem Täter, so dass ich auf Android Asynchronous HTTP Client wechselte, aber es gab keine Änderung wirklich. Ich bin meistens Ausnahmen wie immer:

NoHttpResponseException: The target server failed to respond The target server failed to respond URL: https://xx.xx.xx.xx/heartbeat/

und für die SSL-fähige Verbindungen auch:

javax.net.ssl.SSLException: Read error: ssl=0x784bc588: I/O error during system call, Connection reset by peer Read error: ssl=0x784bc588: I/O error during system call, Connection reset by peer URL: https://xx.xx.xx.xx/heartbeat/

Ich würde im Grunde wie der Täter zuerst verfolgen, so weiß, dass die App über Mobilfunknetze laufen meist, Ich bin offen für jeden Vorschlag, wie ich mit diesem Problem weiter fortfahren kann, da ich im Moment ein wenig feststecke.

+0

Haben Sie die Leistung Ihres Servers vollständig überprüft? –

+0

"Verbindung zurückgesetzt durch Peer" Dies ist wahrscheinlich ein Serverproblem. Um es deutlich zu machen, können Sie es vielleicht mit WireShark verfolgen. http://www.wireshark.org/ – Devrim

+0

Ihre neue Bibliotheksauswahl hat interessante Probleme: https://github.com/loopj/android-async-http/issues – flup

Antwort

0

Run diese App und machen nur einen normalen Ping die Fehlerrate zu sehen: https://play.google.com/store/apps/details?id=com.ulfdittmer.android.ping

Run auf beiden Mobilnetz (Mobilfunk) und WiFi.

Wenn Sie WLAN nutzen, führen Sie ping -n 100 google.com von einem Laptop aus, um sicherzustellen, dass Ihr Router und Netzwerkzugriffspunkt nicht flockig sind. Wenn dies der Fall ist, ziehen Sie den Router aus der Steckdose und stecken Sie ihn wieder ein. Linksys Router und Access Points sowie Belkin Access Points werden so flockig.

Wenn Sie einen Heartbeat-Wert von 10 Sekunden benötigen, setzen Sie das HTTP-Timeout auf 3-5 Sekunden und schlagen Sie schnell fehl, und versuchen Sie es erneut, falls es fehlschlägt.

0

Gut, wenn Sie Ihre HttpClient-Instanz über den Heartbeat-Thread und den ui-Thread freigeben, kann die reguläre HTTP-Verbindungsanforderung den Vorgang abbrechen. Bitte stellen Sie sicher, dass sie keine Anfrage zur selben Zeit senden, entweder indem Sie das Objekt sperren oder HttpClient-Instanzen trennen.