Alle Originalinhalte werden auf Ukrainisch erstellt. Noch nicht alle Inhalte wurden übersetzt. Einige Beiträge sind möglicherweise nur auf Ukrainisch verfügbar.Mehr erfahren

Thundering Herd Problem: was ist das und warum bricht es die Produktion

Beitrags-Cover: Thundering Herd Problem: was ist das und warum bricht es die Produktion
InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
Thundering herd problem - ist eine Situation in der Softwareentwicklung, wenn viele Prozesse oder Anfragen gleichzeitig auf dieselbe Ressource zugreifen. Jeder von ihnen handelt logisch und korrekt, aber zusammen erzeugen sie einen plötzlichen Anstieg der Last, den das System nicht bewältigen kann.
Der Name ist metaphorisch: Stellen Sie sich eine Herde von Tieren vor, die gleichzeitig aufbricht. Einzelne Tiere sind kein Problem, aber zusammen können sie alles auf ihrem Weg niederreißen.

Beispiel Thundering Herd

In der Praxis sieht das oft so aus: Sie haben einen Cache mit TTL. Der Schlüssel läuft ab, und in diesem Moment kommen viele Anfragen. Jede von ihnen sieht, dass der Cache leer ist, und beschließt, selbst zur Datenbank oder zu einem externen Dienst zu gehen. Infolgedessen erhalten Sie anstelle einer kontrollierten Anfrage Hunderte oder Tausende. Die Datenbank wird überlastet, die Latenz steigt, es treten Timeouts auf und manchmal sogar ein vollständiger Ausfall des Dienstes. Der Cache, der das System schützen sollte, verwandelt sich tatsächlich in einen Auslöser für eine Katastrophe.
Dieses Problem ist besonders tückisch, da es nicht in ruhigen Bedingungen auftritt, sondern genau in den schlimmsten Momenten: während des Spitzenverkehrs, nach dem Neustart von Diensten, bei Deployments oder wenn eine externe Abhängigkeit langsamer zu antworten beginnt. Lokal oder in der Staging-Umgebung ist es fast unmöglich, es zu reproduzieren, weshalb es in der Produktion wie ein "zufälliger" Vorfall ohne offensichtlichen Grund aussieht.

Wie kämpft man gegen thundering herd?

Gegen thundering herd kann man unterschiedlich vorgehen, aber die Idee ist immer die gleiche: Das System sollte sich nicht zu synchron verhalten. Oft reicht es aus, nur einem Prozess zu erlauben, den Cache zu aktualisieren, während alle anderen entweder warten oder den vorherigen Wert lesen. In anderen Fällen ist es besser, vorübergehend etwas veraltete Daten bereitzustellen, als eine Lawine von Anfragen an die Datenbank zu erzeugen. Selbst ein kleines Detail wie eine zufällige Verschiebung der TTL kann das Risiko erheblich verringern, dass alle Schlüssel gleichzeitig ablaufen.
Eine separate Kategorie von Problemen sind Retries. Wenn der Dienst ausfällt oder langsam antwortet, zwingt naive Retry-Logik die Clients, die Anfragen synchron zu wiederholen. Anstatt sich zu erholen, erhält das System einen noch größeren Schlag. Daher sind Verzögerungen, exponentielles Backoff und zufälliger Jitter keine Optimierung, sondern eine Notwendigkeit.
Thundering herd ist kein Bug im Code, sondern eine Folge architektonischer Entscheidungen. Es tritt dort auf, wo das System quantitativ skaliert, aber den Wettbewerb um gemeinsame Ressourcen nicht berücksichtigt. Wenn man nicht nur darüber nachdenkt, "wie es funktioniert", sondern auch darüber, "wie es sich unter Last verhält", kann man dieses Problem bereits in der Entwurfsphase vermeiden.

Dieser Beitrag hat noch keine Ergänzungen vom Autor.

Was ist der Vanilla Rails-Ansatz?
14. Nov, 16:48 Uhr

Was ist der Vanilla Rails-Ansatz?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was ist Elasticsearch und wie funktioniert es?
22. Nov, 12:35 Uhr

Was ist Elasticsearch und wie funktioniert es?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was ist eine Zeitreihen-Datenbank?
22. Nov, 12:42 Uhr

Was ist eine Zeitreihen-Datenbank?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
22. Nov, 12:49 Uhr

Was ist VACUUM in PostgreSQL?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was ist ein B-Baum (ausgeglichener Baum)?
22. Nov, 12:58 Uhr

Was ist ein B-Baum (ausgeglichener Baum)?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Fix des Problems bei der Installation von Ruby 3.4.3 (und nicht nur) über RVM auf macOS (Apple Silicon)
30. Dez, 14:05 Uhr

Fix des Problems bei der Installation von Ruby 3.4.3 (und nicht nur) über RVM auf macOS (Apple Silicon)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was ist Exponential Backoff und Random Jitter?
15. Jan, 15:24 Uhr

Was ist Exponential Backoff und Random Jitter?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Anbindung des Elasticsearch-Dienstes an die Rails-Anwendung (Coolify in der Cloud, Server bei Hetzner).
15. Feb, 13:45 Uhr

Anbindung des Elasticsearch-Dienstes an die Rails-Anwendung (Coolify in der Cloud, Server bei Hetzner).

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
„Kein Speicherplatz mehr auf dem Gerät“ - wenn Docker die ganze Festplatte aufgefressen hat
15. Feb, 19:57 Uhr

„Kein Speicherplatz mehr auf dem Gerät“ - wenn Docker die ganze Festplatte aufgefressen hat

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
15. Feb, 20:03 Uhr

Sidekiq 7.3.x und connection_pool 3.0 - Inkompatibilität, die die Worker bricht

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska