𝗣𝗼𝘀𝘁𝗴𝗿𝗲𝗦𝗤𝗟 𝗔𝗱𝘃𝗶𝘀𝗼𝗿𝘆 𝗟𝗼𝗰𝗸𝘀 𝗳𝘂̈𝗿 𝘃𝗲𝗿𝘁𝗲𝗶𝗹𝘁𝗲𝘀 𝗝𝗼𝗯-𝗦𝗰𝗵𝗲𝗱𝘂𝗹𝗶𝗻𝗴

Fügen Sie Redis oder SQS nicht einfach nur für das Job-Scheduling zu Ihrem Stack hinzu.

Sie können stattdessen PostgreSQL Advisory Locks verwenden. Dieser Ansatz macht neue Infrastruktur überflüssig.

In meinen Tests bewältigt dieses Setup 10.000 Jobs pro Minute auf einer einzigen Datenbankinstanz. Es schlägt Redis oft in der Latenz, da Ihre Worker bereits über Datenbankverbindungen verfügen. Sie vermeiden so einen zusätzlichen Netzwerk-Hop.

So implementieren Sie es:

• Verwenden Sie pg_try_advisory_xact_lock, um Jobs zu beanspruchen. • Verwenden Sie FOR UPDATE SKIP LOCKED, um Zeilenkonflikte zu handhaben. • Verwenden Sie die transaktionale Variante, um Lock-Leaks zu vermeiden.

Warum transaktionale Locks wichtig sind:

Transaktionale Locks werden automatisch freigegeben, wenn eine Transaktion committet oder ein Rollback durchführt. Dies verhindert verwaiste Locks, falls Ihre Anwendung abstürzt. Zudem funktioniert es sicher mit PgBouncer im Transaktionsmodus.

Vermeiden Sie Session-Locks, wenn Sie PgBouncer verwenden. PgBouncer weist Verbindungen zwischen Transaktionen neu zu. Dies bricht Locks auf Session-Ebene und führt zu stillen Fehlern.

Wenn Sie Session-Locks benötigen, erstellen Sie einen separaten Connection Pool für Ihre Worker. Mischen Sie Web-Traffic und Job-Worker-Traffic nicht im selben Pool.

Skalierung mit Keys:

Advisory Locks verwenden einen bigint oder zwei Integer. Die Verwendung von zwei Integern ermöglicht ein natürliches Namespacing. Wenn Sie Text-Keys zu einem bigint hashen, achten Sie auf Kollisionen. Die Anzahl der Kollisionen bleibt gering, bis Sie 100.000 verschiedene Lock-IDs erreichen. Nutzen Sie darüber hinaus die Zwei-Integer-Form, um auf der sicheren Seite zu sein.

Der Kompromiss:

• Advisory Locks punkten durch Einfachheit und geringe Betriebskosten. • Redis punktet durch reinen Durchsatz und horizontale Skalierung.

Die meisten Teams benötigen nicht mehr als 10.000 Jobs pro Minute. Wenn Sie unter diesem Limit liegen, bleiben Sie bei PostgreSQL. Das hält Ihre Architektur sauber und Ihre Kosten niedrig.

Quelle: https://dev.to/software_mvp-factory/postgresql-advisory-locks-for-distributed-job-scheduling-15kp