文章摘要
PgQue是一个轻量级Postgres队列工具,仅需一个SQL文件即可安装,使用pg_cron定时触发,无额外依赖,简洁高效。
文章总结
以下是文章主要内容的精简中文陈述:
PgQue - 零膨胀的Postgres队列系统
项目简介
PgQue是一个基于PostgreSQL的轻量级队列系统,通过单一SQL文件即可安装,依赖pg_cron进行定时触发。它重建了Skype时代设计的PgQ队列引擎,采用纯PL/pgSQL实现,无需C扩展或独立守护进程,可在任何PostgreSQL 14+环境运行(包括RDS、Aurora等托管服务)。
核心优势
- 零膨胀设计:通过快照批处理和表轮转(TRUNCATE)机制,避免传统SKIP LOCKED队列的dead tuple问题
- 稳定吞吐:在持续负载下保持性能稳定(测试显示:86k事件/秒写入,240万事件/秒消费)
- 原生多消费者:支持事件驱动的扇出(fan-out)模式,每个消费者维护独立游标
- 完整事务支持:ACID事务、死信队列(DLQ)、重试机制
- 无外部依赖:仅需Postgres和pg_cron(或自定义调度器)
技术对比
| 特性 | PgQue | 传统队列(River/pg-boss等) |
|---------------------|-------|--------------------------|
| 快照批处理 | ✅ | ❌ |
| 无死元组积累 | ✅ | ❌ |
| 无外部守护进程 | ✅ | 多数需要 |
| 托管服务兼容 | ✅ | 部分兼容 |
安装与使用
1. 通过SQL文件安装:psql --single-transaction -f sql/pgque.sql
2. 启动定时任务:SELECT pgque.start()(需pgcron)
3. 基础操作示例:
```sql
-- 创建队列和消费者
SELECT pgque.createqueue('orders');
SELECT pgque.subscribe('orders', 'processor');
-- 发送消息 SELECT pgque.send('orders', '{"order_id": 42}'::jsonb);
-- 消费消息 SELECT * FROM pgque.receive('orders', 'processor', 100); ```
适用场景
- 需要稳定高吞吐的事件驱动架构
- 避免数据库膨胀的长时间运行系统
- 多消费者订阅同一事件流的场景
项目状态
早期阶段,核心架构基于久经考验的PgQ设计。提供Python/Go/TypeScript客户端示例,完整文档包含教程、API参考和性能测试报告。
许可证
Apache-2.0,包含源自PgQ(ISC许可)的代码。
(注:已过滤GitHub页面导航菜单、提交历史等非核心内容,保留技术说明和关键操作指南)
评论总结
以下是评论内容的总结:
对数据库作为队列的质疑
- 有人认为数据库队列并非"零膨胀",不同人对"膨胀"定义不同(评论1:"once person's feature is bloat to someone else")
- 有人质疑延迟数据矛盾:消费者延迟0.25ms vs端到端1-2秒(评论2:"It says it has 0.25ms...end to end latency is between 1-2 seconds")
技术方案比较
- 三种主要方案对比:SKIP LOCKED/分区/TRUNCATE,PgQue优势在于避免VACUUM死锁(评论4:"Table grows indefinitely, instead of...VACUUM-starved death spiral")
- 有用户证实SKIP LOCKED方案在生产环境存在性能问题(评论5:"The vacuum pressure is real...caused massive DB perf issues")
产品定位争议
- 多位评论者认为这更像是事件日志(Kafka)而非传统队列(评论6:"It's more Kafka than Rabbitmq";评论8:"This is a log")
- 支持者认为Postgres方案可避免维护Kafka集群(评论3:"Postgres durability without...Kafka clusters seems enticing")
其他讨论
- 指出其他数据库也支持队列功能(评论7:"Any database that supports SKIP LOCKED is fine")
- 对LLM生成代码的担忧(评论9:"trusting something LLM coded with your production data")
- 询问性能指标(评论10:"How many message per second")