Hacker News 中文摘要

RSS订阅

PgQue:零膨胀Postgres队列 -- PgQue: Zero-Bloat Postgres Queue

文章摘要

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.create
queue('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. 对数据库作为队列的质疑

    • 有人认为数据库队列并非"零膨胀",不同人对"膨胀"定义不同(评论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")
  2. 技术方案比较

    • 三种主要方案对比: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")
  3. 产品定位争议

    • 多位评论者认为这更像是事件日志(Kafka)而非传统队列(评论6:"It's more Kafka than Rabbitmq";评论8:"This is a log")
    • 支持者认为Postgres方案可避免维护Kafka集群(评论3:"Postgres durability without...Kafka clusters seems enticing")
  4. 其他讨论

    • 指出其他数据库也支持队列功能(评论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")