Im Zusammenhang mit Webservices habe ich den Begriff "TCP Connection Churn" verwendet. Speziell Twitter finagle hat Möglichkeiten, dies zu vermeiden. Wie ist es passiert? Was heißt das?Was bedeutet es für TCP-Verbindungen zu Abwanderung?
Antwort
Es gibt möglicherweise mehrere Verwendungen für diesen Begriff, aber ich habe es immer in Fällen verwendet, in denen viele TCP-Verbindungen in sehr kurzer Zeit hergestellt werden, was zu Leistungsproblemen auf dem Client und möglicherweise auch auf dem Server führt .
Dies tritt häufig auf, wenn Client-Code geschrieben wird, der sich bei einem TCP-Fehler jeglicher Art automatisch verbindet. Wenn es sich bei diesem Fehler um einen Verbindungsfehler handelt, bevor die Verbindung überhaupt hergestellt wurde (oder sehr früh beim Protokollaustausch), kann der Client in eine Fast-Beschäftigt-Schleife wechseln, die ständig Verbindungen herstellt. Dies kann zu Leistungsproblemen auf der Client-Seite führen - erstens, dass ein Prozess in einer sehr ausgelasteten Schleife CPU-Zyklen aufsaugt und zweitens jeder Verbindungsversuch eine clientseitige Port-Nummer verbraucht - wenn dies schnell genug geht, kann die Software umhergehen wenn sie die maximale Portnummer erreichen (da ein Port nur eine 16-Bit-Nummer ist, ist dies sicherlich nicht unmöglich).
Während das Schreiben von robustem Code ein wertvolles Ziel ist, ist dieser einfache "automatische Wiederholungsversuch" etwas zu naiv. Sie können ähnliche Probleme in anderen Zusammenhängen sehen - z. Ein Elternprozess startet einen Kindprozess, der sofort abstürzt, ständig neu. Ein gemeinsamer Mechanismus, um dies zu vermeiden, ist eine Art von Back-Off. Wenn die erste Verbindung fehlschlägt, verbinden Sie sich sofort erneut. Wenn es innerhalb kurzer Zeit wieder fehlschlägt (z. B. 30 Sekunden), warten Sie beispielsweise 2 Sekunden vor dem erneuten Verbinden. Wenn es innerhalb von 30 Sekunden erneut fehlschlägt, warten Sie 4 Sekunden und so weiter. Lesen Sie the Wikipedia article on exponential backoff (oder this blog post könnte für diese Anwendung besser geeignet sein) für mehr Hintergrund zu dieser Technik.
Dieser Ansatz hat den Vorteil, dass er den Client oder Server nicht überlastet, aber auch, dass der Client ohne manuellen Eingriff wiederhergestellt werden kann (was insbesondere für Software auf einem unbeaufsichtigten Server oder im großen Fall entscheidend ist) Cluster).
In Fällen, in denen die Wiederherstellungszeit kritisch ist, ist auch eine einfache Ratenbegrenzung der TCP-Verbindungserstellung möglich - vielleicht nicht mehr als 1 pro Sekunde oder so. Wenn es viele Clients pro Server gibt, kann dieser einfachere Ansatz jedoch immer noch den Server überschwemmen lassen, indem er eine hohe Verbindungsrate akzeptiert und dann schließt.
Eine Sache zu beachten, wenn Sie Exponential Backoff verwenden möchten - ich empfehle eine maximale Wartezeit auferlegen, oder Sie können feststellen, dass längere Fehler einen Client zu lange dauern, sobald das Server-Ende wieder Verbindungen akzeptiert. Ich würde unter den meisten Umständen etwas wie 5 Minuten als ein vernünftiges Maximum vorschlagen, aber natürlich hängt es von der Anwendung ab.
- 1. Was bedeutet es, etwas "zu schließen"?
- 2. Was bedeutet es, einen Wert zu normalisieren?
- 3. Was bedeutet es, eine Serviceverbindung zu verlieren?
- 4. Was bedeutet es, zwei Funktoren zu komponieren?
- 5. Was bedeutet es für eine ComboBox, "heiß" zu sein?
- 6. Was bedeutet es für eine Hash-Funktion, inkrementell zu sein?
- 7. Was bedeutet es, MPI für Shared Memory zu konfigurieren?
- 8. Was bedeutet es, einen Index für skalare Variablenfehler zu haben?
- 9. Was bedeutet es, mehrere Sortierschlüsselspalten zu haben?
- 10. Was bedeutet es, auf GitHub zu verzweigen?
- 11. Was bedeutet es, gegen etwas zu verlinken?
- 12. Was bedeutet es, "Nachteile zu hacken"?
- 13. Was bedeutet es, ein Objekt zu klonen()?
- 14. Was bedeutet es, eine Steckdose zu spülen?
- 15. wechseln (! 0) Was bedeutet es
- 16. Was ist POI und was bedeutet es?
- 17. Was bedeutet Skalierbarkeit für Sie?
- 18. Was bedeutet GL_UNSIGNED_BYTE für glTexImage2D?
- 19. Was bedeutet es, setDelegate zu verwenden: auf einem UIViewController?
- 20. Was bedeutet '$ :: n' für Perl?
- 21. Was bedeutet es zu sagen, ein Typ ist "boxed"?
- 22. Linux Kernel - Was bedeutet es, einen Inode zu "putten"?
- 23. Was bedeutet es, eine Sammlung "vertikal" und "horizontal" zu filtern?
- 24. Was bedeutet es, dieses Puzzle als CSP
- 25. Was bedeutet es, einen Stern vor ein Register zu setzen?
- 26. Daten [] in Jsonp - was es bedeutet?
- 27. Was bedeutet es, ROMFS im RAM anzuhängen?
- 28. Jsoup userAgent auf Android - Was bedeutet es?
- 29. Was bedeutet es $ 1Z in regulärem Ausdruck bedeutet
- 30. Was bedeutet ~ bedeutet in Linux, wie es funktioniert?
Sinnvoll - dies könnte definitiv ein Problem für einen Dienst mit einer Client-Seite sein, die andere Server nicht erreichen kann. Danke für deine Antwort! – eman