Honker:在 SQLite 上实现 Postgres NOTIFY/LISTEN 语义

查看原文 HN 讨论

文章摘要

Honker 是一个 SQLite 扩展,把 Postgres 风格的 NOTIFY/LISTEN 语义带到了 SQLite 世界。它在单一 SQLite 文件之上提供了”持久化的发布订阅、任务队列和事件流,无需客户端轮询,也无需独立的守护进程或消息代理”。换句话说,原本要靠 Redis、RabbitMQ、Celery 才能实现的能力,现在只需要一个 SQLite 文件。

它的核心价值在于”事务一致性”:业务写入和入队操作可以在同一个 SQLite 事务里原子提交。如果业务事务回滚,对应的任务、事件、通知也会一起回滚——这就是经典的”事务性 outbox”模式被进一步简化到极致。功能层面,Honker 提供了三类原语:跨进程的轻量级通知(ephemeral notifications)、带消费者偏移量的持久事件流(durable streams)、以及至少一次(at-least-once)语义的工作队列。其工作队列支持指数退避重试、优先级、延迟执行、死信表、任务超时与过期;此外还内置了具名分布式锁、限流器、带 leader 选举的 cron 风格周期任务调度,以及可选的任务结果持久化。

技术亮点在于”唤醒机制”:传统轮询会带来延迟和资源浪费,Honker 利用 SQLite 自身提供的 PRAGMA data_version——一个会随每次 commit 自增的内部计数器——以 1 毫秒间隔检查。这样实现了跨进程”个位数毫秒”延迟的事件传递,而无需应用层做主动轮询。队列操作还使用 partial index 把工作集保持在很小的体量,让 claim 操作不受历史数据增长影响。Honker 同时为 Python、Node.js、Rust、Go、Ruby、Bun、Elixir 提供了绑定,所有语言共享同一个 SQLite 扩展和兼容的 schema。

HN 评论精华