Serverless-Plattformen sind sehr gut darin, schnell Nebenläufigkeit zu erzeugen. PostgreSQL ist nicht dafür ausgelegt, Tausende von kurzlebigen Clients, die gleichzeitig direkte Verbindungen öffnen, zu unterstützen. Diese Diskrepanz ist einer der häufigsten Fehlerarten in modernen Anwendungsarchitekturen: Die Anwendungsschicht skaliert, während die Datenbank ihre Zeit mit dem Management von Verbindungswechseln verbringt.
Deshalb ist PgBouncer wichtig.
Warum PgBouncer hilft
PgBouncer sitzt zwischen Ihrer Anwendung und Postgres und wiederverwendet eine kleinere Anzahl von echten Datenbankverbindungen über eine größere Anzahl von Anwendungsclients. In der Praxis verbessert dies in der Regel:
- Verbindungstabilität unter Spitzenlast
- Speicherbelastung auf der Datenbank
- Überlebensfähigkeit während Deployments und Verkehrsspitzen
Ein gängiges Setup sieht so aus:
[databases]
app = host=postgres.internal port=5432 dbname=appdb
[pgbouncer]
pool_mode = transaction
default_pool_size = 50
max_client_conn = 1000
Es geht nicht darum, 1.000 Anforderungen in 1.000 echten Postgres-Sitzungen laufen zu lassen. Es geht darum, die Compute-Schicht in etwas zu glätten, das die Datenbank tolerieren kann.
Der wichtige Trade-Off
PgBouncer ändert die Verbindungssemantik, insbesondere im transaction-Pooling-Modus. Funktionen, die mit Sitzungsstatus rechnen, könnten brechen oder sich anders verhalten:
- vorbereitete Anweisungen auf Sitzungsebene
- temporäre Tabellen über Transaktionen hinweg
SET-Zustände, die annehmen, dass Verbindungen kleben bleiben
Das bedeutet, dass Sie den Pooling-Modus bewusst wählen und die Annahmen Ihrer ORM- oder Abfrageschicht überprüfen müssen.
Bessere betriebliche Regel
Wenn die Compute-Schicht burstartig ist, betrachten Sie das Verbindungsmanagement als Architektur und nicht als Detail auf niedriger Ebene. Serverless plus direkte Postgres-Verbindungen ist oft in der Entwicklung in Ordnung und in der Produktion schmerzhaft. PgBouncer existiert, um diese Diskrepanz zu absorbieren, bevor die Datenbank zum Engpass wird.
Weiterführende Literatur