Read in English · Leer en español · Lire en français
Abschnitt 9.7 von 9.8 · Fortgeschritten · 25 Min. Lesezeit
Kapazitätsplanung und Performancetests
Videolektion
4 Min. · auf Englisch gesprochen, mit UntertitelnNur anhören (Audio)
Transkript lesen
Willkommen zu Abschnitt neun Punkt sieben. Kapazitätsplanung beantwortet eine Frage im Voraus: Haben wir von allem genug, wenn die Nachfrage ihren Höhepunkt erreicht? Performancetests liefern die Belege.
Vor einer großen Hochzeit schätzt ein Caterer, wie viele Gäste kommen werden. Er rechnet aus, wie viele Teller jeder Koch in einer Stunde anrichten kann. Er plant ein paar zusätzliche Kräfte ein, falls jemand krank wird. Er bestellt die zusätzlichen Öfen Wochen im Voraus, weil man sie am Tag selbst nicht kaufen kann. Und er hält eine Probe in voller Größe ab, um zu prüfen, ob die Küche es wirklich schafft. Softwareteams machen genau dasselbe.
Erstens: Prognostizieren Sie die Nachfrage, also Wachstum, saisonale Spitzen und bekannte Ereignisse. Drücken Sie sie zur Spitze aus, in Einheiten wie Anfragen pro Sekunde, nicht als Tagesdurchschnitt. Zweitens: Messen Sie durch Tests, wie viel eine Instanz oder eine Datenbank aufnehmen kann und dabei noch ihr Latenzziel einhält. Die praktische Grenze ist der Knick der Antwortzeitkurve, nicht der Punkt, an dem das System abstürzt. Drittens: Planen Sie Reserven für Prognosefehler, Lastspitzen und Wiederholungen ein und genug Redundanz, um den Verlust einer Instanz oder einer ganzen Zone zu überstehen. Viertens: Bestellen Sie alles mit langer Vorlaufzeit. Ein Zahlungsanbieter braucht unter Umständen Wochen Vorlauf, um ein Limit anzuheben.
Die Tests unterscheiden sich in der Last, die sie anlegen, und in der Frage, die sie beantworten. Ein Lasttest steigert die Last bis zur prognostizierten Spitze und hält sie, um Latenz und Fehler zu prüfen. Ein Stresstest geht weit über die Spitze hinaus, um zu sehen, wie das System ausfällt und ob es sich erholt. Ein Soak-Test läuft Stunden oder Tage, um schleichende Lecks aufzudecken, etwa bei Speicher oder Verbindungen. Ein Spike-Test springt in Sekunden von niedrig auf sehr hoch, um die Verzögerung des Autoscalings und die Rate Limiter zu testen. Und ein Breakpoint-Test steigert die Last stetig, bis etwas bricht, um die tatsächliche Grenze und den ersten Engpass zu finden.
Wie der Lastgenerator Benutzer simuliert, ist enorm wichtig. In einem geschlossenen Modell sendet eine feste Zahl virtueller Benutzer jeweils eine Anfrage, wartet auf die Antwort, pausiert und sendet erneut. Wenn das System langsamer wird, wartet also jeder Benutzer länger, und es kommen weniger Anfragen an. Die Last sinkt von selbst. In einem offenen Modell treffen Anfragen mit fester Rate ein, ob frühere beantwortet wurden oder nicht. So verhalten sich echte Besucher einer öffentlichen Website. Wenn das System langsamer wird, wachsen also die Queue und die Antwortzeiten immer weiter. Bei öffentlichem Traffic und Vorverkaufsstarts kann ein Test mit geschlossenem Modell gefährlich optimistisch sein.
Eine verwandte Falle heißt Coordinated Omission. Ein Test soll alle zehn Millisekunden eine Anfrage senden. Bei fünfzig Sekunden friert das System für zehn Sekunden ein. Ein Testwerkzeug mit geschlossener Schleife wartet auf jede Antwort und hängt daher ebenfalls. Es zeichnet einen Messwert von zehn Sekunden auf und etwa neuntausend schnelle. Nach dem geplanten Zeitplan wären während des Einfrierens aber etwa tausend Anfragen eingetroffen, um bis zu zehn Sekunden verzögert, im Schnitt um etwa fünf. Der Bericht meldet also für das neunundneunzigste Perzentil eine Millisekunde. Korrigiert sind es etwa neun Sekunden. Die Abhilfe sind Generatoren nach dem offenen Modell, die ab dem Zeitpunkt messen, zu dem jede Anfrage gesendet werden sollte.
Planen wir einen Vorverkaufsstart für eine Stadiontour: hundertachtzigtausend Tickets. Im virtuellen Warteraum werden etwa vierhunderttausend Fans erwartet. Bei zweieinhalb Tickets pro Bestellung ist die Tour mit zweiundsiebzigtausend Bestellungen ausverkauft. Die bindende Beschränkung ist das Limit des Zahlungsanbieters von hundertzwanzig Zahlungen pro Sekunde. Mit einem Drittel Reserve für Wiederholungen und bei achtzig Prozent kaufenden Fans lässt das Team hundert Fans pro Sekunde ein. Jeder Fan verbringt etwa vier Minuten im Kaufprozess, also sind nach Littles Gesetz vierundzwanzigtausend gleichzeitig aktiv. Das sind dreitausendzweihundertfünfzig Anfragen pro Sekunde. Bei vierhundert pro Instanz sind das neun Instanzen, oder fünfzehn, um den Verlust einer Zone zu überstehen, gestartet vor halb zehn. Der Warteraum selbst verarbeitet zwanzigtausend Anfragen pro Sekunde, ausgeliefert am CDN-Edge, ohne je die API-Schicht zu erreichen. Die Tour ist in etwa fünfzehn Minuten ausverkauft. Doppelt so viele Server würden die Tickets nicht schneller verkaufen: Die knappste gemeinsame Ressource gibt das Tempo vor.
Der vollständige Abschnitt behandelt Testwerkzeuge, realistische Testdaten und Performance-Budgets. Als Nächstes betrachten wir in Abschnitt neun Punkt acht, dem letzten dieses Kapitels, Chaos Engineering und Incidents. Bis gleich.
Was Sie wissen müssen
- Die Kapazitätsplanung prognostiziert die Spitzennachfrage, misst die Kapazität pro Einheit unter realistischen Bedingungen, plant Reserven und Redundanz ein und bestellt alles mit langer Vorlaufzeit, einschließlich Kontingenten und Limits von Drittanbietern.
- Last-, Stress-, Soak-, Spike- und Breakpoint-Tests beantworten unterschiedliche Fragen: ob die Ziele bei Spitzenlast erreicht werden, wie das System darüber hinaus ausfällt, ob es mit der Zeit nachlässt, wie es auf plötzliche Lastsprünge reagiert und wo die tatsächliche Grenze liegt.
- Geschlossene Lastmodelle werden langsamer, wenn das System langsamer wird, während bei offenen Modellen weiterhin Anfragen mit fester Rate eintreffen; öffentlicher Traffic und Vorverkaufsstarts sind offen, daher können Tests mit geschlossenem Modell gefährlich optimistisch sein (Schroeder, Wierman und Harchol-Balter, 2006).
- Coordinated Omission (Gil Tene) verbirgt langsame Antworten, wenn ein Testwerkzeug vor dem Senden auf Antworten wartet; messen Sie ab dem geplanten Sendezeitpunkt, mit Lastgeneratoren nach dem offenen Modell und vollständigen Histogrammen.
- k6, Gatling, JMeter und Locust sind die wichtigsten Open-Source-Werkzeuge; realistische Szenarien, Datenmengen, Hot Keys, die Latenz von Abhängigkeiten und ein nicht ausgelasteter Generator sind wichtiger als das Werkzeug.
- Performance-Budgets, etwa die Schwellenwerte der Core Web Vitals oder eine Latenzzuteilung pro Hop, werden in der Delivery-Pipeline automatisch als Fitness Functions geprüft.
- Die knappste gemeinsam genutzte Ressource, oft ein Drittanbieter, bestimmt die sichere Einlassrate für ein Ereignis wie einen Ticket-Vorverkaufsstart.
Kapazität ist ein Plan, keine Hoffnung
Die Kapazitätsplanung beantwortet eine Frage im Voraus: Werden wir von allem genug haben, wenn die Nachfrage ihren Höhepunkt erreicht? Alles
umfasst mehr als Server. Dazu gehören Datenbankverbindungen und Schreibdurchsatz, Cache-Speicher, Partitionen des Message Brokers, Kontingente des Cloud-Kontos, Rate Limits von Drittanbietern, Lizenzen und die Personen in Rufbereitschaft. Die Elastizität der Cloud macht manche Kapazität schnell verfügbar, aber nicht jede: Eine primäre Datenbank lässt sich nicht in Sekunden verdoppeln, ein Zahlungsanbieter braucht unter Umständen Wochen Vorlauf, um ein Limit anzuheben, und Autoscaling (behandelt in Abschnitt 9.1) reagiert in Minuten auf einen Lastsprung, der in Sekunden eintrifft.
Die Methode hat vier Schritte, die in einem regelmäßigen Zyklus wiederholt werden (vierteljährlich bei stetigem Wachstum, pro Ereignis bei Produktstarts und Vorverkaufsstarts):
Der Zyklus der Kapazitätsplanung
- Nachfrage prognostizierenKombinieren Sie organisches Wachstum (Bestellungen pro Tag steigen um 4 % im Monat), Saisonalität (Mittags- und Abendspitzen, Freitagabende, Weihnachten) und bekannte Ereignisse (eine Marketingkampagne, ein Vorverkaufsstart für ein Stadion). Drücken Sie die Nachfrage in den Einheiten aus, nach denen das System skaliert: Anfragen pro Sekunde pro Journey, Schreibvorgänge pro Sekunde, Nachrichten pro Sekunde, und zwar zur Spitze, nicht im Tagesdurchschnitt.
- Kapazität pro Einheit messenErmitteln Sie durch Tests, wie viel Last eine Instanz, eine Datenbank oder eine Partition aufnehmen kann, während sie ihr Latenz-SLO noch einhält. Der Knick der Antwortzeitkurve, ab dem die Warteschlangenbildung zu dominieren beginnt (Abschnitt 2.4), ist die praktische Grenze, nicht der Punkt, an dem das System abstürzt.
- Reserven und Redundanz einplanenDimensionieren Sie für die prognostizierte Spitze plus eine Marge für Prognosefehler, Lastspitzen und Wiederholungen, und so, dass beim Verlust einer Instanz oder einer ganzen Availability Zone noch genug Kapazität bleibt (N+1 oder Redundanz auf Zonenebene).
- Vorlaufzeiten planen und überprüfenListen Sie auf, was Zeit braucht (Erhöhungen von Kontingenten, reservierte Kapazität, Datenbank-Upgrades, Limits von Drittanbietern, Hardware für On-Premises-Systeme), und bestellen Sie es rechtzeitig. Vergleichen Sie anschließend die tatsächliche Nachfrage mit der Prognose und verbessern Sie das Modell.
Die Dimensionierung mit Littles Gesetz wurde in Abschnitt 9.1 durchgerechnet; dieser Abschnitt konzentriert sich darauf, wie man vertrauenswürdige Zahlen dafür gewinnt. Der häufigste Fehler in der Kapazitätsplanung ist nicht falsche Arithmetik, sondern eine Kapazität pro Instanz, die unter unrealistischen Bedingungen gemessen wurde, und der zweithäufigste ist eine vergessene gemeinsame Beschränkung, etwa ein Limit eines Drittanbieters, die keine noch so große Kapazitätsreserve auf den eigenen Servern beheben kann.
Arten von Performancetests
Performancetests sind der einzige Weg, Kapazität zu messen, Engpässe zu finden, bevor Kunden sie finden, und zu prüfen, dass ein Release nichts verschlechtert hat. Die Tests unterscheiden sich in der Lastform, die sie anlegen, und in der Frage, die sie beantworten. Ein Lasttest prüft die erwartete Spitze; ein Stresstest geht darüber hinaus, um zu sehen, wie das System ausfällt; ein Soak-Test läuft über Stunden, um schleichende Lecks aufzudecken; ein Spike-Test prüft die Reaktion auf plötzliche Sprünge; ein Breakpoint-Test steigert die Last, bis etwas bricht, um die tatsächliche Grenze zu finden.
Arten von Performancetests
| Test | Beantwortete Frage | Lastform | Typische Dauer | Achten auf |
|---|---|---|---|---|
| Smoke | Funktionieren Testskript und Umgebung überhaupt? | Wenige Benutzer | Minuten | Skriptfehler, falsche Umgebung |
| Last | Erreichen wir unsere Latenz- und Fehlerziele bei der erwarteten Spitze? | Anstieg auf die prognostizierte Spitze, halten | 30–60 Minuten | p99-Latenz, Fehlerrate, Ressourcensättigung |
| Stress | Wie fällt das System jenseits der Spitze aus, und erholt es sich? | Anstieg auf das 1,5- bis 3-Fache der Spitze, dann zurück | 30–60 Minuten | Graceful Degradation, Load Shedding, Erholungszeit |
| Soak (Dauertest) | Verschlechtert sich etwas mit der Zeit? | Normale oder Spitzenlast, gehalten | Stunden bis Tage | Speicherlecks, wachsende Queues, Verbindungslecks, volllaufende Festplatten |
| Spike | Können wir einen plötzlichen Ansturm abfangen? | Sprung von niedrig auf sehr hoch in Sekunden | Minuten | Verzögerung des Autoscalings, Queue-Überlauf, Verhalten des Rate Limiters |
| Breakpoint (Kapazität) | Wo liegt die Grenze, und was ist der erste Engpass? | Stetiger Anstieg bis zum Ausfall | Bis es bricht | Der Knick in der Latenz, die erste gesättigte Ressource |
Offene und geschlossene Lastmodelle
Lastgeneratoren simulieren Benutzer auf eine von zwei Arten, und die falsche Wahl liefert Ergebnisse, die nicht nur ungenau, sondern gefährlich optimistisch sind. In einem geschlossenen Lastmodell betreibt das Werkzeug eine feste Zahl virtueller Benutzer; jeder sendet eine Anfrage, wartet auf die Antwort, pausiert für eine Denkzeit und wiederholt das. Wird das System langsamer, sendet jeder virtuelle Benutzer weniger Anfragen, sodass die Last von selbst sinkt. In einem offenen Lastmodell treffen Anfragen mit einer festen Rate ein, unabhängig davon, wie schnell frühere beantwortet werden, so wie echte Besucher einer öffentlichen Website: Tausende Fans, die um 10:00 auf „Kaufen“ drücken, warten nicht aufeinander.
Bianca Schroeder, Adam Wierman und Mor Harchol-Balter zeigten (Open Versus Closed: A Cautionary Tale
, NSDI 2006), dass die beiden Modelle für dasselbe System und dieselbe durchschnittliche Last sehr unterschiedliche Antwortzeiten liefern können und dass Scheduling- oder Kapazitätsentscheidungen, die unter dem einen Modell optimiert wurden, unter dem anderen falsch sein können. Interne Systeme mit einer festen Population von Clients, etwa eine Callcenter-Anwendung mit 300 Mitarbeitenden, sind einigermaßen geschlossen. Öffentlicher Internet-Traffic, ereignisgesteuerte Consumer, die aus einer Queue gespeist werden, und Vorverkaufsstarts sind offen oder nahezu offen. Für solche Systeme ist ein Test nach dem offenen Modell der realistische; die Executors constant-arrival-rate und ramping-arrival-rate von k6 zum Beispiel setzen ihn um, während der Executor constant-vus geschlossen ist.
Geschlossen und offen im Vergleich
Coordinated Omission
Gil Tene von Azul Systems, Autor der Bibliothek HdrHistogram, gab einem Messfehler einen Namen, der viele Latenztests und Monitoring-Werkzeuge betrifft: Coordinated Omission. Ein Lastgenerator mit geschlossener Schleife wartet auf jede Antwort, bevor er die nächste Anfrage sendet. Wenn das System hängt, hängt der Generator mit, sodass die Anfragen, die echte Benutzer während des Hängers gesendet hätten und die alle langsam gewesen wären, nie gesendet und nie gemessen werden. Das Testwerkzeug koordiniert
sich mit dem System, das es testet, und lässt genau die schlechten Messwerte aus.
Betrachten Sie einen Test, der 100 Sekunden lang alle 10 ms eine Anfrage an einen Dienst senden soll, der normalerweise in 1 ms antwortet. Bei 50 Sekunden friert der Dienst für 10 Sekunden ein (etwa durch eine lange Garbage-Collection-Pause). Das Testwerkzeug mit geschlossener Schleife zeichnet etwa 9000 schnelle Messwerte und einen 10-Sekunden-Messwert auf und meldet daher ein p99 von 1 ms und sogar ein p99.9 von 1 ms. Nach dem geplanten Zeitplan wären während des Einfrierens jedoch etwa 1000 Anfragen eingetroffen, die zwischen 10 Sekunden und 10 ms gewartet hätten, im Durchschnitt etwa 5 Sekunden. Zehn Prozent aller Anfragen wurden stark verzögert: Das wahre p95 liegt bei etwa 5 Sekunden und das wahre p99 bei etwa 9 Sekunden.
Was das Testwerkzeug übersieht
Die Abhilfe besteht darin, für offene Systeme Generatoren nach dem offenen Modell (mit Ankunftsrate) zu verwenden, die Latenz ab dem Zeitpunkt zu messen, zu dem eine Anfrage gesendet werden sollte, und nicht ab dem tatsächlichen Senden, vollständige Histogramme statt Durchschnittswerten aufzuzeichnen und jedem Latenzbericht zu misstrauen, dessen Maximum weit über seinem p99.9 liegt, mit wenigen Messwerten dazwischen. Tenes modifiziertes HTTP-Benchmarking-Werkzeug wrk2 und die Korrekturoptionen von HdrHistogram gibt es genau dafür. Derselbe Fehler tritt im Produktions-Monitoring auf, wenn eine Client-Bibliothek nur die Anfragen misst, die sie senden konnte.
Werkzeuge
Vier Open-Source-Werkzeuge decken die meisten Anforderungen ab. Apache JMeter ist der Veteran: Java-basiert, mit einem grafischen Editor für Testpläne, vielen Protokoll-Plug-ins und Thread-Gruppen, die standardmäßig geschlossen sind. Gatling schreibt Tests als Code (Scala, Java und Kotlin, in jüngerer Zeit auch JavaScript und TypeScript), ist bei hoher Last effizient und bietet offene und geschlossene Injektionsprofile. k6, gepflegt von Grafana Labs, führt JavaScript-Testskripte auf einer in Go geschriebenen Engine aus, hat explizite Executors für das offene und das geschlossene Modell sowie Bestanden-oder-nicht-Schwellenwerte, die sich für Continuous Integration eignen. Locust beschreibt das Benutzerverhalten in Python und verteilt die Last auf Worker-Prozesse; seine Benutzer arbeiten mit geschlossener Schleife. Kommerzielle und in der Cloud gehostete Dienste ergänzen eine verteilte Lasterzeugung in großem Maßstab und Reporting.
Das Szenario ist wichtiger als das Werkzeug. Ein gutes Skript bildet den echten Mix der Journeys nach (aus der Produktionsanalyse: vielleicht 70 % Stöbern, 20 % Änderungen am Warenkorb, 10 % Bezahlvorgang), realistische Denkzeiten, realistische Daten (verschiedene Benutzer, Restaurants und Plätze, nicht 10.000-mal derselbe) und das richtige Lastmodell, und es prüft die Antworten auf Korrektheit, denn eine schnelle Fehlerseite ist keine erfolgreiche Anfrage.
import http from 'k6/http';
import { check } from 'k6';
export const options = {
scenarios: {
onsale: {
executor: 'ramping-arrival-rate', // open model: arrivals per second
startRate: 100, timeUnit: '1s',
preAllocatedVUs: 2000, maxVUs: 20000,
stages: [
{ target: 4900, duration: '2m' }, // ramp to 1.5x design load
{ target: 4900, duration: '20m' }, // hold
],
},
},
thresholds: { // fail the run if missed
http_req_failed: ['rate<0.005'],
http_req_duration: ['p(99)<500'],
},
};
export default function () {
const res = http.get('https://perf.tickets.example/api/events/42/seats');
check(res, { 'status is 200': (r) => r.status === 200 });
}Realistische Umgebungen und Daten
Ein Performancetest ist nur so vertrauenswürdig wie seine Umgebung. Eine Testdatenbank mit 10.000 Zeilen, deren Indizes in den Arbeitsspeicher passen, sagt nichts über die Produktion mit 200 Millionen Zeilen aus, bei denen das nicht der Fall ist. Die folgende Checkliste erfasst die üblichen Unterschiede.
Größe und Form der Daten: Datenmengen in Produktionsgröße und realistische Verteilungen, einschließlich Hot Keys wie der beliebtesten Restaurants oder der besten Plätze, die Konkurrenzsituationen erzeugen, die ein gleichmäßiger Test nie sieht. Dieselben Bausteine: dieselben Instanztypen, Container-Limits, Datenbankkonfiguration, Größen der Verbindungspools und Netzwerktopologie (einschließlich Hops zwischen Zonen). Cache-Zustand: Testen Sie sowohl warme als auch kalte Caches, denn ein Deployment oder Failover leert sie (Abschnitt 7.6). Abhängigkeiten: Dienste von Drittanbietern werden durch Stubs ersetzt, die deren echte Latenzverteilung und Rate Limits nachbilden, nicht durch sofortige Antworten. Isolation: keine Tests anderer Teams in derselben Umgebung, sonst sind die Ergebnisse Rauschen. Der Generator selbst: genug Kapazität für die Lastgeneratoren an den richtigen Standorten; ein Generator, der mit 100 % CPU läuft, misst sich selbst.
Manche Organisationen testen vorsichtig in der Produktion, weil keine Kopie ihr je ganz gleicht: synthetische Benutzer und Testereignisse, die aus dem Geschäftsreporting ausgeschlossen werden, Traffic Shadowing (echte Anfragen werden an eine neue Version kopiert und deren Antworten verworfen) und schrittweise Steigerungen mit automatischen Abbruchbedingungen. Das erfordert dieselben Schutzmaßnahmen wie Chaos-Experimente: einen kleinen Blast Radius, einen Notausschalter und eine genaue Beobachtung der SLOs.
Performance-Budgets
Ein Performance-Budget ist eine Grenze, die eine Änderung nicht überschreiten darf, im Voraus vereinbart und automatisch geprüft, damit die Performance nicht Regression für Regression erodiert. Bei Web-Frontends decken Budgets das Seitengewicht, die Skriptgröße und die Core Web Vitals ab; Googles Schwellenwerte für eine gute Erfahrung, gemessen am 75. Perzentil der Seitenaufrufe, sind dort ein Largest Contentful Paint von höchstens 2,5 Sekunden, eine Interaction to Next Paint von höchstens 200 ms und ein Cumulative Layout Shift von höchstens 0,1.
Bei Backends teilt ein Latenzbudget ein Ende-zu-Ende-SLO auf die Hops einer Journey auf. Der Checkout der Essenslieferplattform hat ein p99-Ziel von 800 ms; das Team weist 20 ms dem Gateway zu, 60 ms dem Bestellservice, 80 ms der Preisgestaltung, 450 ms der Zahlung (das meiste davon für den externen Kartenanbieter), 40 ms der Datenbank, 100 ms Netzwerk und Serialisierung und behält 50 ms in Reserve. Jedes Team kennt nun sein eigenes Ziel, und eine Änderung, die die Preisgestaltung auf 150 ms treibt, wird als Budgetverletzung sichtbar, bevor sie zur SLO-Verletzung wird. Streng genommen addieren sich die Perzentile der Teile nicht zum Perzentil des Ganzen; behandeln Sie die Aufteilung daher als technische Zuteilung und prüfen Sie den Ende-zu-Ende-Wert gesondert.
Budgets werden durchgesetzt, indem in der Delivery-Pipeline ein kurzer, stabiler Performancetest läuft und der Build fehlschlägt, wenn ein Schwellenwert überschritten wird, wie es die k6-Schwellenwerte oben tun. Das ist eine Fitness Function für die Performance. Tests in der Pipeline müssen eher wiederholbar als realistisch sein: dieselbe Umgebung, dieselben Daten, dieselbe Last, damit eine Änderung um 10 % eine echte Regression bedeutet und kein Rauschen.
Ausgearbeitetes Beispiel
Ausgearbeitetes Beispiel: ein Kapazitätsplan für einen Ticket-Vorverkaufsstart
Dies ist ein anderes, größeres Ereignis als der Vorverkaufsstart in Abschnitt 9.3, mit eigenen Zahlen. Eine Stadiontour umfasst drei Abende mit je 60.000 Plätzen, insgesamt 180.000 Tickets, die an einem Freitag um 10:00 in den Verkauf gehen. Fans betreten einen virtuellen Warteraum und werden mit kontrollierter Rate in den Kaufprozess eingelassen. Lasttests haben den Knick jeder API-Instanz bei 520 Anfragen pro Sekunde gemessen; das Team plant mit 400, um p99 unter 500 ms zu halten.
| Nachfrageprognose | 520.000 Vorab-Registrierungen, von denen etwa 75 % voraussichtlich erscheinen: Planen Sie mit 400.000 Fans im Warteraum. Bei durchschnittlich 2,5 Tickets pro Bestellung ist die Tour mit 72.000 Bestellungen ausverkauft. |
|---|---|
| Bindende Beschränkung | Das vereinbarte Limit des Zahlungsanbieters liegt bei 120 Zahlungen pro Sekunde. Wenn 80 % der eingelassenen Fans kaufen und ein Drittel des Limits für Wiederholungen und Fehler zurückbehalten wird, lassen Sie 100 Fans pro Sekunde ein (6000 pro Minute): 80 Zahlungen pro Sekunde. |
| Aktive Fans (Littles Gesetz) | 100 Fans/s × 240 s im Kaufprozess = 24.000 gleichzeitig aktive Fans |
| API-Last | 100 Fans/s × 25 Anfragen pro Journey = 2500 Anfragen/s; × 1,3 für gehäufte Saalplan-Aufrufe = 3250 Anfragen/s Auslegungslast |
| Instanzen | 3250 / 400 = 8,1, also 9 Instanzen; um den Verlust einer von drei Zonen zu überstehen, müssen 9 in zwei Zonen passen: 5 pro Zone × 3 = 15 Instanzen, gestartet vor 09:30 |
| Datenbank für Platzreservierungen | 1,5 Reservierungsversuche pro Fan = 150 Schreibvorgänge/s bei gemessenen 600 Schreibvorgängen/s mit p99 unter 50 ms: 25 % Auslastung, aber testen Sie die Konkurrenz um die beliebtesten Plätze |
| Warteraum | 400.000 Fans, die alle 20 s abfragen = 20.000 Anfragen/s, ausgeliefert am CDN-Edge, ohne die API-Schicht je zu erreichen |
| Ergebnis | 72.000 Bestellungen / 80 pro Sekunde = 900 s: ausverkauft in etwa 15 Minuten, nachdem etwa 90.000 Fans eingelassen wurden; der Warteraum muss alle anderen umgehend informieren |
| Vorlaufzeiten | Zahlungslimit 3 Wochen vorher bestätigt; Cloud-Kontingent 1 Woche vorher erhöht; Lasttest mit dem 1,5-Fachen (etwa 4900 Anfragen/s), Spike- und 2-stündiger Soak-Test 2 Wochen vorher in einer Umgebung in Produktionsgröße |
Die Einlassrate wird von der knappsten gemeinsam genutzten Ressource bestimmt, hier dem Zahlungsanbieter, nicht davon, wie viele Server sich das Team leisten kann; doppelt so viele Server würden die Tickets nicht schneller verkaufen.
Autoscaling ist hier ein Sicherheitsnetz, nicht der Plan: Ein Sprung von null auf 3250 Anfragen pro Sekunde um 10:00:00 kommt schneller, als Instanzen starten können.
Prüfen Sie Ihr Verständnis
Warum unterschätzt ein Lasttest nach dem geschlossenen Modell bei einer öffentlichen Website tendenziell die Antwortzeiten?
Weil seine virtuellen Benutzer auf jede Antwort warten, bevor sie mehr senden, sodass die angebotene Last sinkt, wenn das System langsamer wird, während echte Besucher weiter eintreffen und die Queues wachsen.
Ein Testwerkzeug zeigt ein p99 von 2 ms und ein Maximum von 8 s, mit fast keinen Messwerten dazwischen. Was sollten Sie vermuten?
Coordinated Omission: Das Testwerkzeug hing wahrscheinlich mit dem System und hat die vielen Anfragen nicht erfasst, die während der Pause verzögert worden wären.
Warum ermöglichen im Vorverkaufsbeispiel zusätzliche API-Instanzen keinen schnelleren Ausverkauf?
Weil das Limit des Zahlungsanbieters von 120 Zahlungen pro Sekunde, nicht die API-Schicht, begrenzt, wie viele Fans pro Sekunde kaufen können.
Wofür ist ein Soak-Test gedacht?
Um Probleme zu finden, die erst mit der Zeit unter gleichbleibender Last auftreten, etwa Speicher- oder Verbindungslecks, wachsende Queues und volllaufende Festplatten.
Quellen und weiterführende Literatur
Haben Sie eine Frage zu diesem Abschnitt? ArchitectBot, der KI-Lernassistent des Kurses, antwortet zuerst aus dem Kurs.
Fragen: „Wir bereiten uns auf einen großen Ticket-Vorverkaufsstart vor. Wie ermittle ich, wie viele Instanzen wir brauchen und welche Lasttests wir vorher durchführen sollten?“