Nachrichtenverkehr steigt nicht an – er spitzt sich zu. Eine Eilmeldung kann Sie in 90 Sekunden von 8K RPS auf 200K RPS bringen und dann wieder abfallen, bevor Ihr Autoscaler fertig ist, die Knoten zu starten.
Das Skalieren einer Nachrichten-App bedeutet, für spikegesteuerten, leselastigen, frischeempfindlichen, global verteilten Traffic zu entwickeln – vier Einschränkungen, die in verschiedene Richtungen ziehen. Im Gegensatz zu Steady-State-SaaS-Workloads muss eine Nachrichten-App 10x-30x-Verkehrsspitzen in weniger als zwei Minuten absorbieren und gleichzeitig korrigierbare, manchmal veränderbare Inhalte bereitstellen. Generische Skalierungshinweise ("fügen Sie eine CDN hinzu, skalieren Sie automatisch nach CPU") scheitern hier, da aggressives Caching die Frische beeinträchtigt und aggressive Frische Ihren Ursprung beeinträchtigt.
Diese Anleitung behandelt vier Möglichkeiten, mehr Traffic in einer Nachrichten-, Finanz-, Sport- oder Aggregator-App zu bewältigen. Sie enthält Skalierungsschwellenwerte, Cache-Lebensdauern, Code zum Abrufen von Artikeln und einen Build-or-Buy-Kostenvergleich für 100K, 1M und 10M monatlich aktive Benutzer.
TL;DR — Was sich bei Skalierung ändert
- Stellen Sie die HPA-Skalierung auf 65% CPU mit einem 30-Sekunden-Stabilisierungsfenster ein – Nachrichten-Spitzen sind schärfer als typische SaaS-Kurven.
- Verwenden Sie stale-while-revalidate mit einem 30-Sekunden-Fresh-Fenster für Breaking News; streben Sie eine Trefferquote von CDN über 94% an.
- Halten Sie die p99-Latenz am Edge für Schlagzeilen-Endpunkte unter 250ms; degradieren Sie auf nur-Cache, wenn die Ursprungs-p99 800ms überschreitet.
- Begrenzen Sie die Ursprungs-RPS über Token-Bucket-Aufnahme am Load Balancer, bevor der Autoscaler reagiert.
- Überspringen Sie Kafka bis ca. 10M MAU. Redis Streams, SQS oder Postgres LISTEN/NOTIFY verarbeiten realistischen Nachrichten-Fan-out darunter.
Problem 1: Der Spike bei Eilmeldungen
Was passiert. Der Steady-State-Traffic liegt bei 8K–15K RPS. Ihr Redaktionsteam veröffentlicht eine Eilmeldung. Innerhalb von 45–90 Sekunden sind Sie bei 150K–250K RPS, die meist dieselben drei URLs anfordern.
Warum es passiert. Nachrichtenverkehr ist bimodal. Push-Benachrichtigungen, App-Badges, Social Shares und Aggregator-Abholungen (Apple News, Google Discover, X/Twitter) feuern gleichzeitig. Im Gegensatz zu einer Black Friday-Kurve, die sich über Stunden aufbaut, hat ein Nachrichten-Spitzenwert keine Vorwarnung. Allein Ihre HPA-Cooldown-Zeit (typischerweise 60–120s) ist länger als der Spitzenwert selbst.
Lösung: Aus dem Edge bereitstellen, nicht vom Ursprung
Die Lösung besteht darin, den Spike niemals den Ursprung erreichen zu lassen. Drei Ebenen:
Edge-Schicht — CDN mit stale-while-revalidate. Setzen Sie Cache-Control: public, max-age=30, stale-while-revalidate=120, stale-if-error=600. Das sind 30 Minuten frische Antworten, 2 Minuten, in denen der Edge veraltete Daten liefert und asynchron neu validiert, und 10 Minuten als Sicherheitsnetz, falls der Ursprung ausfällt. Bei einem Anstieg sollten 99.5% der Anfragen niemals den Ursprung berühren.
Zugriffskontrolle am Load Balancer. Wenden Sie einen Token-Bucket pro IP und pro Route an. Für Headline-Endpunkte erlauben Sie 20 Anfragen/s/IP Burst, anhaltend 5 Anfragen/s/IP. Für nicht authentifizierten Verkehr, reduzieren Sie auf 503 mit Retry-After: 5, wenn der Ursprung p99 800ms überschreitet. Besser 0.1% Benutzer scheitern zu lassen, als das gesamte System zum Absturz zu bringen.
Cache beim Veröffentlichen vorladen. Wenn das CMS einen Artikel veröffentlicht, löst eine SQS- oder Redis-Stream-Nachricht GET-Anfragen für dessen URL-, Listen-Endpunkte und Homepage an jedem Cache-Standort aus. Der Cache füllt sich, bevor die Push-Benachrichtigung gesendet wird. Im hier beschriebenen Beispiel stieg die CDN-Trefferquote von ~78% während eines Kalt-Cache-Anstiegs auf über 96%.
Zu verwendende Zahlen
| Signal | Schwellenwert | Aktion |
|---|---|---|
| HPA Scale-out | 65% CPU anhaltende 30s | Pods hinzufügen |
| HPA Scale-in | 35% CPU anhaltendes 5min | Pods entfernen |
| Ursprüngliche Veröffentlichungs-p99 | > 800ms | in den Nur-Cache-Modus wechseln |
| Edge-Trefferrate | < 90% | Pre-Warm auslösen |
| Pro-IP-Burst | > 20 Anfragen/s bei Schlagzeilen | 429 mit Retry-After |
Problem 2: Der Kaltstart-Cache-Stampede
Was passiert. Sie stellen bereit. Oder Sie schalten auf eine gesunde Region um. Oder Sie leeren einen CDN-Cache-Schlüssel nach einer Korrektur. Die nächsten 50K Anfragen für diese URL treffen alle parallel auf den Ursprungsserver, da noch niemand die Antwort hat. Der Ursprungsserver bricht zusammen.
Warum es passiert. Es ist der klassische Cache Stampede / Dogpile, verschlimmert für Nachrichten, weil (a) Sie oft leeren – Korrekturen, Sperrungen, Aufhebungen von Embargos –, (b) Breaking-News-URLs von allen gleichzeitig zum ersten Mal aufgerufen werden und (c) regionales Failover zur schlechtesten Zeit passiert, während des Spitzenwerts, der das Failover verursacht hat.
Lösung
- Request Coalescing am Edge. Cloudflare Workers, Fastly Compute@Edge und Vercel Edge unterstützen Single-Flight: Nur eine Anfrage pro Cache-Schlüssel erreicht den Ursprung, alle anderen gleichzeitigen Anfragen warten auf diese Antwort. Aktivieren Sie es explizit – es ist nicht immer Standard.
- Probabilistische frühe Ablaufzeit. Berechnen Sie den Cache 5–10% der Zeit neu, bevor TTL abläuft. Verteilt die Erneuerungs-Last, anstatt jeden Knoten auf einen Scheitelpunkt zu synchronisieren.
- Zweistufiger Cache. L1 am Edge (CDN), L2 in einem regionalen Redis-Cluster zwischen Edge und Origin. Selbst wenn L1 fehlschlägt, absorbiert L2 den Ansturm.
Funktionierender Code: Ingestion mit Wiederholungsversuchen
Implementieren Sie für die Ursprungsschicht, die aus einer Nachrichtenquelle abruft – Ihren eigenen Scraper oder eine lizenzierte Nachrichten-API – Backoff und Idempotenz. Unten sehen Sie einen Python-Client gegen den APITube /v1/news/everything-Endpunkt, mit exponentiellem Backoff, Jitter und 429-bewusstem Verhalten.
import os, time, random, requests
from typing import Iterator
API = "https://api.apitube.io/v1/news/everything"
KEY = os.environ["APITUBE_KEY"]
def fetch_with_backoff(params, max_attempts=5):
for attempt in range(max_attempts):
try:
r = requests.get(
API,
params=params,
headers={"X-API-Key": KEY},
timeout=8,
)
if r.status_code == 429:
retry_after = int(r.headers.get("Retry-After", "2"))
time.sleep(retry_after + random.uniform(0, 0.5))
continue
if r.status_code >= 500:
time.sleep((2 ** attempt) + random.uniform(0, 0.3))
continue
r.raise_for_status()
return r.json()
except requests.Timeout:
time.sleep((2 ** attempt) + random.uniform(0, 0.3))
raise RuntimeError(f"APITube failed after {max_attempts} attempts")
def stream_breaking(category_id="medtop:04000000", lang="en") -> Iterator[dict]:
page = 1
while True:
data = fetch_with_backoff({
"language.code": lang,
"category.id": category_id, # IPTC medtop id, e.g. medtop:04000000 = business
"per_page": 100,
"page": page,
"published_at.start": "now-15m",
})
for article in data.get("results", []):
yield article
if not data.get("has_next_pages"):
return
page += 1
Für Ad-hoc-Operator-Nutzung, das entsprechende Curl:
curl -sS "https://api.apitube.io/v1/news/everything?language.code=en&category.id=medtop:13000000&per_page=20" \
-H "X-API-Key: $APITUBE_KEY"
Das published_at.start=now-15m-Fenster plus Routing-Caching an Ihrem Edge ermöglicht eine kostengünstige Aufnahme mit der relevanten Rate, ohne denselben 24-Stunden-Inhaltsausschnitt alle 30 Sekunden abzufragen.
Problem 3: Cache TTL vs. Aktualität – das Nachrichtenparadox
Was passiert. Aggressives Caching sorgt für eine 96%-Trefferquote und schont Ihren Ursprungsserver. Aber eine Geschichte, die Sie vor 5 Minuten gecacht haben, könnte bereits sachlich falsch sein – Korrekturen, Entfernungen, Rücknahmen, Aufhebung von Embargos. Nachrichteninhalt ist veränderlich, auf eine Weise, wie SaaS-Dashboards es nicht sind.
Warum es passiert. Nachrichtenorganisationen geben ständig Korrekturen heraus. Eine hochkarätige Korrektur, die 30 Minuten lang veraltet ist, birgt ein Diffamierungsrisiko, nicht nur ein UX-Risiko. Dennoch zerstört ein 60-Sekunden-TTL auf der Homepage Ihre Trefferquote während eines Spitzenwerts.
Lösung: TTL nach Inhaltsklasse, nicht nach Website
Zwischenspeichern Sie jede cachebare Antwort in eine dieser Klassen und wenden Sie die entsprechende Richtlinie an.
| Inhaltsklasse | max-age | stale-while-revalidate | stale-if-error | Notizen |
|---|---|---|---|---|
| Aktuelle Nachricht (letzte 30 Min.) | 30en | 120s | 600s | Aggressives SWR; verlassen Sie sich auf Purge für Korrekturen |
| Standardartikel (>30 Min, <24h) | 5m | 600s | 3600en | Masse des Verkehrs |
| Evergreen / Archivartikel | 1h | 86400s | 86400s | ändert sich selten |
| Homepage / Abschnittsindex | 60s | 300en | 1800s | aktualisiert durch Editorial Publish Webhook |
| Suchergebnisseite | 0 (privat) | — | — | pro Benutzer, niemals teilen |
| Autor / Themen-Landingpage | 5m | 600s | 3600en | niedrige Schreibrate |
| Statische Ressource (Bild, JS, CSS) | 1 | — | — | gehashte Dateinamen |
Kombinieren Sie dies mit Purge-on-Publish: Jeder CMS-Schreibvorgang löst eine CDN-Bereinigung für betroffene Schlüssel aus (Artikel-URL, übergeordneter Abschnitt, Homepage). In Kombination mit SWR erhalten Sie eine globale Verbreitung von Korrekturen in unter -100m Sekunden, ohne die Trefferquote aufzugeben, die den Ursprung bei Spitzen am Leben erhält.
Ein subtiler Punkt: Variieren Sie den Cache nicht nach User-Agent, es sei denn, Sie liefern tatsächlich unterschiedliche Inhalte. Das Aufteilen des Cache-10x zwischen mobilen und Desktop-Varianten zerstört die Trefferquote. Verwenden Sie responsives HTML und lassen Sie den Client sich anpassen.
Problem 4: Ingestionskosten – Bauen vs. Kaufen
Was passiert. Architekturdiagramme enden bei „Nachrichteninhalt von Quellen aufnehmen“. Diese Box verbirgt 30–60% Ihrer tatsächlichen Infrastrukturkosten bei der Skalierung. Die meisten Architekten unterschätzen sie bei der ersten Iteration.
Warum es passiert. Die Nachrichtenaufnahme ist unglamourös und teuer: rotierende Residential Proxies, Headless-Browser-Farmen für JS-lastige Quellen, Parser-Wartung für ~5,000 Quellen, deren HTML sich wöchentlich ändert, Deduplizierung über Syndikate hinweg, Spracherkennung, Entitätsextraktion, Stimmungsklassifizierung, Paywall-Handling und rechtliche Prüfung. Nichts davon ist in der KI-Übersicht-Antwort auf "Wie skalieren Nachrichten-Apps?".
Lösung: Modellieren Sie die Überlappung ehrlich
Der Break-Even-Punkt zwischen In-House-Ingestion und einer lizenzierten Nachrichten-API ist nicht 100K MAU. Es ist auch nicht 100M MAU. Das untenstehende Modell ist realistisch – Ihre Zahlen werden variieren, aber die Form nicht.
| MAU-Tarif | DIY-Ingestion (monatlich) | Lizenzierte Nachrichten API (monatlich) | Crossover-Hinweis |
|---|---|---|---|
| 100K MAU | $400–1,200 (1 Server, 1 Dev zur 10% Zeit, ~1k Artikel/Tag Limit) | $0–$150 (kostenlos oder Einstiegsstufe) | API gewinnt eindeutig. DIY ist Ingenieurzeit, die Sie nicht haben. |
| 1M MAU | $3,500–9,000 (Proxys, Parser, 1 FTE, ML für Entitäten) | $300–1,500 (mittlere API) | API gewinnt immer noch. Versteckte Kosten sind die FTE – ~$15k–20k/Monat belastet. |
| 10M MAU | $15,000–40,000 (3–5 FTE, dedizierte Infrastruktur, rechtliche Überprüfung) | $2,000–12,000 (Enterprise-Stufe) | Crossover-Zone. API ist zum Listenpreis immer noch günstiger; DIY kann sich lohnen, wenn Nachrichten-Daten Ihr Kernunterscheidungsmerkmal sind. |
| 100M MAU | $80,000–$250,000+ (vollständiges Redaktions- und Technikteam) | $20,000–60,000 (Enterprise + benutzerdefiniert) | Beides funktioniert. Die Entscheidung ist strategisch (Kontrolle, Datenlizenzierung) und nicht finanziell. |
Das Fazit: Die meisten Nachrichten-Apps unter 10M MAU sollten die Aufnahme kaufen, nicht selbst bauen, selbst wenn der Bauch ihres VP Engineering anders sagt. Die DIY-Spalte oben enthält nicht den Aufwand für Deduplizierung und Qualitätsabstimmung, der 6–12 Monate dauert, bevor Ihre Daten mit einem lizenzierten Feed vergleichbar sind.
Ein Hinweis zu Bias: APITube ist eine der Nachrichten-APIs in dieser Kategorie. Das Crossover-Argument gilt, unabhängig davon, ob Sie von uns, einem Mitbewerber lizenzieren oder direkt mit Reuters oder AP eine Wire-Service-Beziehung aufbauen.
Der konträre Punkt: Sie brauchen Kafka erst ab ~10M MAU
Jeder Systemdesign-Post empfiehlt Kafka an der Grenze zwischen Aufnahme und Feed. Für Nachrichten-Apps unter 10M MAU ist dies fast immer verfrüht.
Was Sie tatsächlich unter -10M MAU benötigen:
- Eine Warteschlange für redaktionelle Veröffentlichungsereignisse → CDN-Bereinigung plus Push-Benachrichtigungs-Fanout. Durchsatz: Hunderte bis wenige Tausend Ereignisse pro Minute, nicht pro Sekunde. SQS, Redis Streams oder Postgres LISTEN/NOTIFY bewältigen dies alle.
- Eine Warteschlange für Ingestionsjobs (Quelle X abfragen, Artikel Y parsen). Durchsatz: Tausende pro Minute. Gleiche Antwort.
Wann sich Kafka auszahlt:
- Nachhaltiger Durchsatz über ~100K Ereignissen/Sekunde über mehrere Verbrauchergruppen hinweg.
- Wiederholungsanforderungen (Analyse-Wiederholungen, ML-Feature-Backfills), bei denen Sie ein 7–30-Tagesprotokoll benötigen.
- Multi-Tenant-Organisation, bei der die Warteschlangentopologie der Vertrag zwischen Diensten ist.
Wenn keine dieser Beschreibungen auf Sie zutrifft, Kafka verursacht zusätzlichen Betriebsaufwand – Broker-Tuning, Consumer-Lag-Dashboards, ZooKeeper oder KRaft-Management, Schema-Registry-Rituale –, ohne Ihnen etwas zu bieten, was Redis Streams nicht kann. Fan-out von Nachrichten ist sprunghaft, aber absolut gering im Volumen, was bedeutet, dass eine verwaltete Warteschlange dasselbe leistet, aber nur ein Zehntel der Betriebskosten verursacht. Wir haben beobachtet, wie News-Startups ein SRE Quartal damit verbrachten, von Kafka zu migrieren, nachdem sie ihre Spitzenlast bei 4K Events/Sekunde gemessen hatten.
Das Standardverhalten für eine Nachrichten-App unter 10M MAU sollte sein: SQS oder Redis Streams für alles; Überprüfung bei 10-Wachstum.
Zusammenfügen: Ein Referenz-Stack
Für eine Nachrichten-App, die auf 1M–10M MAU abzielt, ist dies die Architektur, die wir heute bauen würden:
- Edge: Cloudflare oder Fastly. SWR + Workers für Request Coalescing und pro-Edge-Personalisierung. Multi-CDN (e.g., +CloudFront) nur, wenn Sie einen einzelnen CDN-Vorfall gemessen haben.
- Origin: Kubernetes (EKS/GKE), 3 AZ, HPA auf 65% CPU mit 30s-Fenster, min 6 / max 80 Replikate, hinter einem ALB oder NLB mit Token-Bucket-Aufnahme.
- Cache L2: Redis Cluster, 3 Shards × 2 Replikas, ~16GB Speicher insgesamt bei 1M MAU.
- Datenbank: Postgres für redaktionelle und Metadaten (16-vCPU primär, 1 Lese-Replik pro Region), OpenSearch für Volltext-Artikelsuche.
- Ingestion: lizenzierte Nachrichten API (APITube oder Peer) → kleine Worker-Flotte, die normalisiert, gegen die letzten 7 Tage dedupliziert und in Postgres + Redis + OpenSearch schreibt.
- Async: Redis Streams oder SQS. Kein Kafka.
- Observability: p50/p95/p99 pro Route, CDN Trefferquote, Ursprungs-RPS, Warteschlangentiefe. Alarm bei Trefferquote < 92%, Ursprungs-p99 > 800ms, Warteschlangenverzögerung > 60s.
Dieser Stack verarbeitet 10M MAU kostengünstig im Rahmen einer Series-A-Burnrate. Die Architekturdiagramme in den Top-Suchergebnissen gehen von Ingenieurteams auf FAANG-Niveau aus. Das muss bei Ihnen nicht der Fall sein.
Häufig gestellte Fragen
Wie gehen Nachrichten-Websites mit hohem Traffic um?
Nachrichten-Websites bewältigen hohen Traffic, indem sie die Spitzen am CDN-Edge mit Stale-While-Revalidate-Caching absorbieren, den Edge bei redaktionellen Veröffentlichungen vorwärmen und Token-Bucket-Admission-Control am Origin-Load-Balancer anwenden. Eine gut abgestimmte Nachrichtenplattform liefert während Traffic-Spitzen über 95% der Anfragen aus dem Edge-Cache, sodass die Origin-Schicht den Ansturm nie direkt sieht. Die am höchsten wirksame Technik ist das Vorwärmen des Caches zur Veröffentlichungszeit, damit der Edge vor dem Auslösen von Push-Benachrichtigungen heiß ist.
Welche Architektur nutzen Nachrichten-Apps?
Die meisten modernen Nachrichten-Apps verwenden eine vierstufige Architektur: eine Multi-PoP-CDN am Edge für Caching und SWR, eine zustandslose Origin-Schicht auf Kubernetes mit horizontaler Autoskalierung, ein Redis-Cluster für Hot-Path-Caching von Artikeln und Abschnittsindizes sowie Postgres plus OpenSearch für redaktionelle Metadaten und Volltextsuche. Die Aufnahme läuft als separater Worker-Fleet, der oft von einer lizenzierten Nachrichten-API zieht, anstatt einen internen Scraper zu unterhalten.
Wie skaliert man eine Nachrichtenanwendung?
Sie skalieren eine Nachrichtenanwendung, indem Sie für spitzengetriebenen Traffic und nicht für steady-state Lasten entwerfen. Stellen Sie HPA-Skalierung bei 65% CPU mit einem 30-Sekunden-Fenster ein, verwenden Sie stale-while-revalidate mit einem 30-Sekunden-Frischfenster für Breaking News, zielen Sie auf eine CDN-Trefferquote über 94% und wärmen Sie Edge-Caches bei jeder redaktionellen Veröffentlichung vor. Halten Sie die Origin-Schicht zustandslos, damit die automatische Skalierung tatsächlich hilft, und setzen Sie ein Token-Bucket-Aufnahmelimit davor.
Was nutzen große Nachrichtenseiten CDN?
Große Nachrichtenseiten verwenden typischerweise Fastly, Cloudflare, Akamai oder AWS CloudFront, und viele betreiben Multi-CDN-Setups für Ausfallsicherheit. The New York Times und Washington Post verwenden Fastly, die BBC verwendet Akamai für die globale Auslieferung, und Reuters hat historisch Multi-CDN-Routing verwendet. Die Wahl ist weniger wichtig als die Konfiguration: Stale-while-revalidate, Request Coalescing und Edge Computing für Personalisierung bestimmen, ob die CDN tatsächlich Ihre Spitzen absorbiert.
Wie gehen Nachrichten-Apps mit Breaking-News-Traffic-Spitzen um?
Nachrichten-Apps bewältigen Spitzen des Breaking-News-Traffics durch drei kombinierte Techniken: Vorwärmen des CDN-Caches im Moment der redaktionellen Veröffentlichung, damit der Edge heiß ist, bevor Push-Benachrichtigungen ausgelöst werden; Ausliefern veralteter Inhalte mit Stale-While-Revalidate während des Ansturms, sodass der Ursprung nur Revalidierungsverkehr sieht; und Anwenden von Admission Control am Load Balancer, um Bot- oder Scraper-Verkehr abzufangen, bevor er Anwendungsserver erreicht. Mit diesen Maßnahmen kann eine Nachrichten-App bei 8K konstantem RPS einen 200K RPS-Anstieg absorbieren, ohne den Ursprung überhaupt skalieren zu müssen.
Nächste Schritte
Wenn Sie gerade die Ingestionsschicht modellieren, schließen Sie eine lizenzierte Feed für eine Woche an und messen Sie, bevor Sie sich für einen Build-Pfad entscheiden. Der APITube News API gibt Sentiment, Entitäten und Kategorieklassifizierung für jeden Artikel zurück; die kostenlose Stufe liefert 100 Anfragen pro Tag gegen /v1/news/everything, was ausreicht, um die Retry/Backoff-Logik aus dieser Anleitung zu prototypisieren. Die Anleitung für den Einstieg führt durch die Authentifizierung und die nützlichsten Abfrageparameter von Ende zu Ende.


