Postgres as Your Platform: Building Event-Driven Systems with Schema Changes

Bài tóm tắt Neon 2025 2. Tăng trưởng Độ khó: Trung bình

Neon · 2025 · 2. Tăng trưởng · Độ khó: Trung bình — bài gốc

Bài hướng dẫn kiêm quảng bá của nhà cung cấp; ví dụ "FleetOps" là giả định, không phải hệ thật. Mọi nhận định là theo Neon. Trong bài trên web, các đoạn code không còn trong bản tải về.

Ý chính

  • Theo Neon, đội platform thường dựng giàn giáo quanh database (message queue để phát thay đổi, cron đồng bộ schema, webhook báo hệ phía sau). Postgres đã có sẵn đủ thứ để thay đổi schema thành sự kiện: DDL là transaction hạng nhất, notification xếp hàng và gửi ngay sau commit.
  • Bài toán ví dụ: SaaS logistics cho khách tự định nghĩa schema thiết bị IoT; mỗi lần thêm loại sensor thì tự sinh SDK TypeScript, đồng bộ sang warehouse, cập nhật dashboard.

Ba khối xây dựng

  • Event trigger: chạy khi có DDL (CREATE, ALTER, DROP), trong cùng transaction với DDL: trigger lỗi thì thay đổi schema rollback.
  • LISTEN/NOTIFY: pub/sub có từ Postgres 6.4, payload tới 8 KB, giao dưới mili giây cho mọi listener đang nối. Notification mất nếu không ai nghe.
  • Outbox: event trigger ghi một dòng vào bảng outbox rồi NOTIFY; worker đọc bảng, đánh dấu xong. Worker chết thì sự kiện vẫn nằm đó: at-least-once chỉ bằng bảng Postgres. Theo bài, outbox hơn NOTIFY ở ba điểm: bền, phát lại được sau khi sửa bug, query được (schema nào đổi nhiều, automation nào chậm, cái gì lỗi).
  • Worker lai: NOTIFY cho độ trễ thấp khi mọi thứ chạy, tự rơi về poll bảng khi mất kết nối listener.

Chi tiết đáng chú ý

  • Đa tenant: tách tenant bằng namespace schema; trigger ghi lại schema của tenant nào bị sửa để định tuyến automation.
  • Vòng lặp vô hạn: automation tạo bảng (ví dụ bảng migration của code generator) lại kích hoạt trigger; phải lọc sự kiện do chính automation sinh ra.
  • Backpressure "tự nhiên": worker chậm thì outbox dài ra, theo dõi bằng SQL.
  • Phần Neon: event trigger chạy với role kế thừa neon_superuser; thử trigger trên branch copy-on-write trước khi lên production; scale-to-zero thì phải giữ một kết nối hoặc tắt auto-suspend cho listener production.

Bài học cho SWE

  • Outbox là cách ghép "thay đổi trạng thái" với "phát sự kiện" vào cùng một transaction; tín hiệu nhanh (NOTIFY) chỉ là gợi ý đánh thức, nguồn sự thật là bảng (Event-driven, message queue và Kafka).
  • Hệ phản ứng với sự kiện của chính nó phải chặn vòng phản hồi do mình gây ra.
  • So với Allegro 2024: Allegro bỏ outbox + CDC cho pipeline analytics vì, theo Allegro, lỗi kết nối hay consumer gây mất hoặc trùng; ở đây outbox dùng cho automation nội bộ, nơi at-least-once và phát lại là đủ.

Liên quan