almessadi.
Zur Übersicht

PgBouncer schützt Postgres vor burstartigen Compute-Schichten_

Serverless- und automatisch skalierende Rechenleistungen können mehr Verbindungswechsel erzeugen, als PostgreSQL direkt handhaben möchte, weshalb Pooling-Schichten wichtig werden.

Veröffentlicht12. November 2024
Lesezeit8 min read

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