PgQue: Hàng đợi PostgreSQL "Zero-Bloat" chạy hoàn toàn bằng SQL thuần

18 tháng 4, 2026·4 phút đọc

PgQue là sự hồi sinh của kiến trúc hàng đợi PgQ huyền thoại từ Skype, được viết lại hoàn toàn bằng PL/pgSQL. Công cụ này loại bỏ vấn đề bloat dữ liệu, không cần cài đặt extension C và hoạt động mượt mà trên mọi nền tảng PostgreSQL được quản lý.

PgQue: Hàng đợi PostgreSQL "Zero-Bloat" chạy hoàn toàn bằng SQL thuần

PgQue là một giải pháp hàng đợi (queue) mới dành cho PostgreSQL, được thiết kế với tiêu chí "zero-bloat" (không phình to dữ liệu). Điểm đặc biệt nhất của công cụ này là nó được viết hoàn toàn bằng SQL và PL/pgSQL, cho phép cài đặt chỉ với một tệp tin duy nhất mà không cần đến các extension ngôn ngữ C hay daemon bên ngoài.

PostgreSQL 14+PostgreSQL 14+

Tại sao lại là PgQue?

Hầu hết các hệ thống hàng đợi hiện tại trên PostgreSQL đều dựa vào cơ chế SKIP LOCKED kết hợp với DELETE hoặc UPDATE. Mặc dù cách tiếp cận này hoạt động tốt trong các ví dụ đơn giản, nhưng dưới tải cao (sustained load), nó tạo ra lượng lớn "dead tuples". Điều này dẫn đến áp lực lên quá trình VACUUM, sự phình to của index (index bloat) và sự suy giảm hiệu suất theo thời gian.

PgQue giải quyết triệt để vấn đề này bằng cách sử dụng cơ chế batching dựa trên snapshotxoay bảng dựa trên TRUNCATE thay vì xóa từng hàng. Điều này mang lại những lợi ích sau:

  • Zero bloat theo thiết kế: Không tạo ra dead tuples trên đường dẫn chính của hàng đợi.
  • Không suy giảm hiệu suất: Hệ thống không bị chậm đi sau khi chạy trong nhiều tháng.
  • Tương thích Managed Postgres: Hoạt động tốt trên RDS, Aurora, Cloud SQL, AlloyDB, Supabase, Neon mà không cần build custom hay quyền superuser.
  • Độ tin cậy của Postgres: Hỗ trợ đầy đủ ACID, transactional enqueue/consume, WAL, sao lưu và nhân bản.

Sự đánh đổi về độ trễ (Latency)

PgQue được xây dựng xung quanh việc xử lý theo lô (batching) thay vì claim từng dòng một. Đây là chìa khóa giúp loại bỏ bloat dữ liệu và duy trì sự ổn định. Tuy nhiên, sự đánh đổi nằm ở độ trễ truyền tải end-to-end.

Trong cấu hình mặc định, độ trễ thường nằm ở mức khoảng 1–2 giây (tối đa 1 giây cho tick tiếp theo cộng với khoảng thăm dò của consumer). Nếu bạn cần độ trễ cực thấp (mili-giây), PgQue có thể không phải là lựa chọn phù hợp. Nhưng nếu ưu tiên hàng đầu là sự ổn định dưới tải nặng mà không lo về việc bảo trì hiệu suất, PgQue là giải pháp lý tưởng.

So sánh với các giải pháp khác

PgQue khác biệt so với các job queue phổ biến như PGMQ, River, Que hay pg-boss ở chỗ nó tập trung vào việc xử lý sự kiện/event streaming với khả năng fan-out (phát tán đến nhiều consumer) và không làm phình to bảng sự kiện.

Trong khi các giải pháp khác sử dụng UPDATE + DELETE gây ra dead tuples, PgQue sử dụng cơ chế xoay vòng TRUNCATE để đảm bảo không tạo ra dead tuples nào cả. Nó cũng hỗ trợ mô hình fan-out gốc, nơi mỗi consumer duy trì con trỏ (cursor) của riêng mình trên một nhật ký sự kiện chia sẻ, tương tự như các topic trong Kafka.

Cài đặt và Sử dụng

Yêu cầu duy nhất là PostgreSQL phiên bản 14+ và một công cụ gọi hàm pgque.ticker() định kỳ (mặc định là mỗi giây). Tiện ích pg_cron được khuyến nghị sử dụng và đã có sẵn trên hầu hết các nhà cung cấp Managed Postgres.

Quá trình cài đặt cực kỳ đơn giản:

begin;
\i sql/pgque.sql
commit;

Sau đó, bạn có thể khởi tạo ticker và maintenance jobs:

select pgque.start();

PgQue cung cấp API SQL thuần, nghĩa là bạn có thể sử dụng bất kỳ driver Postgres nào (Python, Go, Node.js, v.v.) để tương tác. Dưới đây là ví dụ nhanh:

-- Tạo queue và consumer
select pgque.create_queue('orders');
select pgque.subscribe('orders', 'processor');

-- Gửi tin nhắn
select pgque.send('orders', '{"order_id": 42, "total": 99.95}'::jsonb);

-- Nhận và xử lý (trong giao dịch riêng)
select * from pgque.receive('orders', 'processor', 100);

-- Xác nhận hoàn thành
select pgque.ack(:batch_id);

License Apache 2.0License Apache 2.0

Kết luận

PgQue là một lựa chọn mạnh mẽ cho các hệ thống cần kiến trúc hàng đợi sự kiện (event queue) ổn định, khả năng mở rộng cao và không muốn gặp rắc rối với việc quản lý hiệu suất cơ sở dữ liệu theo thời gian. Với việc loại bỏ sự phụ thuộc vào C extension và daemon, PgQue mang sức mạnh của kiến trúc PgQ đã được kiểm chứng tại Skype đến với mọi nhà phát triển sử dụng PostgreSQL hiện nay.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗