- Benchmarks zur Publish/Subscribe-(Pub/Sub-)- und Queue-Leistung von Postgres zeigen, dass ein einzelnes Datenbanksystem möglicherweise auch ein Messaging-System ersetzen kann
- Auf einem einzelnen 4-vCPU-Knoten wurden 5.036 Schreibvorgänge/s und 25.183 Lesevorgänge/s erreicht; auch in einer replizierten 3-Knoten-Umgebung blieb der Durchsatz ähnlich, bei einer Ende-zu-Ende-Latenz von 186 ms (p99)
- Auf einem großen 96-vCPU-Knoten wurden 238 MiB/s Schreiben und 1,16 GiB/s Lesen erreicht; die CPU-Auslastung blieb unter 10 %, was auf deutliche Leistungsreserven hinweist
- Auch im Queue-Test waren auf einem einzelnen Knoten 2.885 Vorgänge/s möglich, in der replizierten Umgebung 2.397 Vorgänge/s — genug Leistung für die meisten Unternehmen
- Statt eines komplexen verteilten Systems wird gezeigt, dass eine einzelne Postgres-Infrastruktur Workloads im Bereich mehrerer MB/s verarbeiten kann; betont wird der pragmatische Ansatz: „Verwende einfache Technik, bis sie nicht mehr ausreicht“
Zwei Lager bei der Technologiewahl
- Die Tech-Branche teilt sich in ein Buzzword-orientiertes Lager und ein vom gesunden Menschenverstand geleitetes Lager
- Ersteres fühlt sich von Marketingbegriffen wie „Echtzeit“, „unendliche Skalierung“ oder „AI-basiert“ angezogen
- Letzteres legt Wert auf Einfachheit und Pragmatismus und vermeidet unnötige Komplexität
- Zwei aktuelle Strömungen stärken zuletzt die zweite Sichtweise: Small Data und die Postgres-Renaissance
- Datenmengen werden kleiner, Hardware wird leistungsfähiger
- Postgres kann als einzelnes System viele spezialisierte Lösungen ersetzen (
jsonb, pgvector, tsvector usw.)
Überblick über die Benchmarks
- Ziel: messen, wie weit sich Postgres bei Pub/Sub-Messaging und Queue-Verarbeitung skalieren lässt
- Testumgebung: AWS EC2
c7i.xlarge (4 vCPU) und c7i.24xlarge (96 vCPU)
- Vergleich von drei Konfigurationen
- Einzelner Knoten
- Replizierter 3-Knoten-Cluster
- Großer Einzelknoten
Ergebnisse der Pub/Sub-Benchmarks
- 4-vCPU-Einzelknoten
- Schreiben 4,8 MiB/s (5.036 msg/s), Lesen 24,6 MiB/s (25.183 msg/s), Latenz 60 ms (p99)
- CPU-Auslastung 60 %, Festplattenschreiben 46 MiB/s
- 4-vCPU-Replikation mit 3 Knoten
- Schreiben 4,9 MiB/s, Lesen 24,5 MiB/s, Latenz 186 ms (p99)
- Durchsatz bleibt erhalten, jährliche Kosten etwa 11.514 US-Dollar
- 96-vCPU-Einzelknoten
- Schreiben 238 MiB/s (243k msg/s), Lesen 1,16 GiB/s (1,2M msg/s), Latenz 853 ms (p99)
- CPU-Auslastung unter 10 %, Flaschenhals ist die Schreibgeschwindigkeit pro Partition
- Fazit: Bei kleinen bis mittleren Workloads auf einem Niveau, das mit Kafka konkurrieren kann; selbst mit einfacher Struktur sind mehrere zehn MB/s möglich
Ergebnisse der Queue-Benchmarks
- Einfache Queue-Implementierung auf Basis von
SELECT FOR UPDATE SKIP LOCKED
- 4-vCPU-Einzelknoten
- 2,81 MiB/s (2.885 msg/s), Latenz 17,7 ms (p99), CPU 60 %
- 4-vCPU-Replikation mit 3 Knoten
- 2,34 MiB/s (2.397 msg/s), Latenz 920 ms (p99), CPU 60 %
- 96-vCPU-Einzelknoten
- 19,7 MiB/s (20.144 msg/s), Latenz 930 ms (p99), CPU 40–60 %
- Selbst ein einzelner Knoten kann die Anforderungen an den Queue-Durchsatz der meisten Unternehmen erfüllen
Wann Postgres sinnvoll ist
- In den meisten Fällen ist Postgres als Standardwahl vernünftig
- Nachrichten lassen sich per SQL debuggen, ändern und verknüpfen
- Im Vergleich zu Kafka ist der Betrieb einfacher und die Wartung leichter
- Kafka ist für Höchstleistung optimiert, für kleinere Workloads aber oft überdimensioniert
- Zitiert wird Donald Knuths Warnung: „Vorzeitige Optimierung ist die Wurzel allen Übels“
- Bis in den Bereich mehrerer MB/s reicht Postgres völlig aus
Ansatz der minimal lauffähigen Infrastruktur (MVI)
- Minimum Viable Infrastructure: Aufbau eines minimalen Systems mit Technologien, die der Organisation bereits vertraut sind
- Postgres ist weit verbreitet und entsprechendes Personal leicht zu finden
- Je weniger Komponenten, desto geringer die Last durch Ausfälle und Betrieb
- Die Einführung unnötiger Technologien erzeugt organisatorischen Overhead
- Lernen, Monitoring, Deployment und Betrieb werden teurer
Diskussion über Skalierbarkeit
- Postgres lässt sich in der Praxis tatsächlich skalieren
- OpenAI verwendet weiterhin Postgres auf Basis einer einzelnen Schreibinstanz
- Stabiler Betrieb auch im Maßstab von Hunderten Millionen Nutzern
- Die meisten Unternehmen wachsen moderat und haben mehrere Jahre Zeit, bevor ein Technologiewechsel nötig wird
- „Für den Fall eines viralen Erfolgs entwerfen“ ist übertriebenes Overengineering
- Es sei, „als würde man einen Marshall-Verstärker kaufen, um als Vorband von Coldplay aufzutreten“
Fazit
- „Verwende Postgres, bis es wirklich an seine Grenzen stößt“
- Auch einfache Technik kann ausreichend hohe Leistung liefern
- Die Einführung unnötig komplexer verteilter Systeme ist ineffizient
- Zusammen mit moderner Hardware ist Postgres eine pragmatische Wahl, die die meisten Workloads bewältigen kann
1 Kommentare
Hacker-News-Kommentare
Das Pareto-Prinzip auf jede Situation anzuwenden, ist eine Fehlinterpretation
Zu behaupten, Postgres decke 80 % der Use Cases mit 20 % des Aufwands im Vergleich zu Kafka ab, ist eine unbelegte Behauptung
Das Pareto-Prinzip ist nur dort sinnvoll, wo eine Potenzgesetzverteilung auftritt
Man kann einfach sagen, dass Postgres ausreichend viele Use Cases abdeckt und ein stabiles, bewährtes Tool ist
Aus meiner Erfahrung, von kleinen Größenordnungen (ein paar hundert Events pro Stunde) bis hin zu großen Maßstäben (Billionen Events pro Stunde), sollte man zuerst prüfen, ob man überhaupt wirklich eine Queue braucht
Der Ansatz, Postgres für alles zu benutzen, ist riskant
Locks und Serialisierungslevel sind nicht intuitiv und können zu Performance-Bottlenecks führen
Ich nutze Postgres seit Jahrzehnten, aber man sollte Systeme nicht auf blindem Glauben aufbauen
Ich halte einen SQL-basierten Ansatz mit einer Event-Log-Tabelle für effektiv
Ein Nachteil ist allerdings der Mangel an Client-seitigen Tools. Kafka hat dort durch sein reiches Bibliotheks-Ökosystem einen Vorteil
Unser Unternehmen hat die Event-Übertragung zwischen Services auf SQL-Basis standardisiert (feedapi-spec)
Zwar nicht so ausgereift wie Kafka, aber mit einem gemeinsamen Library-Stack, der mehrere Storage-Engines unterstützt, könnte sich daraus etwas entwickeln
Heutzutage fühlen sich viele Leute zu sehr von neuen Technologien angezogen
Postgres ist großartig, aber man sollte das passende Tool für das Problem einsetzen
Postgres wurde nicht für Pub-Sub entworfen, Kafka dagegen genau dafür
Man sollte den Trend vermeiden, dass jedes Produkt „alles auf einmal“ machen will. Meiner Meinung nach sind Tools besser, die eine Sache richtig gut können
Eine monoton steigende Offset-Nummer zu implementieren, ist ein kniffliges Problem
Eine einfache Sequenz verursacht Probleme, weil Transaktionsreihenfolge und Commit-Zeitpunkt auseinanderlaufen können
SELECT FOR UPDATE SKIP LOCKEDdoppelte Verarbeitung vermeidenIch frage mich, ob überhaupt ein echtes Kafka-Benchmarking gemacht wurde
Die Ergebnisse aus einer 96-vCPU-Umgebung wären auch mit einer Kafka-Konfiguration auf 4 vCPU erreichbar
Die Postgres-Performance ist ungewöhnlich langsam
Wenn man Kafka nicht braucht, sollte man es nicht verwenden, aber mit 5k msg/s auf Postgres zu prahlen, ist nicht besonders sinnvoll
Es gibt zwei Extreme: „Leute, die Buzzwords hinterherlaufen“ und „Leute, die nur an dem festhalten, was sie bereits kennen“
Realistische Engineers treffen irgendwo dazwischen pragmatische Entscheidungen
Die Kernfunktion von Kafka ist die Offset-Steuerung pro Consumer
In Umgebungen, in denen mehrere Teams dasselbe Topic lesen, ist das unverzichtbar
Dass man Offsets vor- und zurücksetzen kann, war mehrfach ein echter Rettungsanker
Ich frage mich, ob eine Postgres-Queue so etwas unterstützt
Die Gegenüberstellung „Lager der Buzzword-Jäger vs. Lager des gesunden Menschenverstands“ ist schon an sich falsch
Kafka mit Postgres nachzubauen, ist kein gesunder Menschenverstand
Wenn man wirklich Funktionen auf Kafka-Niveau braucht, sollte man einfach Kafka verwenden