honker 解决的是一个很具体的问题:很多小系统只有一个 SQLite 数据库,却为了发邮件、跑后台任务、推事件,被迫再接 Redis、Kafka 或 Postgres 队列。
它给 SQLite 加上类似 Postgres NOTIFY/LISTEN 的语义,还提供队列、持久流和 20 多个 SQL 函数。实现方式是 Rust SQLite extension。使用条件也很明确:必须启用 SQLite WAL 模式。
我的判断很直接:honker 不是“SQLite 取代 Kafka”的宣言。它更像是把小型应用里最容易裂开的那条缝补上——业务数据和异步任务不要再各过各的日子。
honker 到底给 SQLite 加了什么
honker 的 Python 示例很直白。打开 app.db,创建 emails 队列,调用 enqueue() 放入任务。worker 用 claim("worker-1") 取任务,处理完再 ack()。
这就是小系统最常见的后台任务模型:发邮件、生成缩略图、同步索引、推送通知。过去很多团队会为它额外拉一个 Redis。honker 的思路是,先别急着加服务,能不能在 SQLite 里把这件事做完。
它也支持类 Kafka 的 durable stream。比如在一个事务里更新用户表,再向 user-events stream 发布事件。消费者用 subscribe(consumer="dashboard") 订阅,再把变更推到浏览器。
更底层看,honker 还新增了 20 多个 SQL 函数。原始示例里包括 notify() 和 honker_stream_read_since()。
| 能力 | honker 提供什么 | 对开发者的意义 |
|---|---|---|
| 通知 | notify('orders', '{"id":42}') | 在 SQLite 内获得类似事件通知的语义 |
| 队列 | enqueue / claim / ack | worker 可领取任务并确认完成 |
| 持久流 | publish / subscribe / honker_stream_read_since() | 可按消费者和位置读取事件流 |
| 触发机制 | WAL 模式 + stat .db-wal | 接近实时,但不是无成本实时 |
| 实现形态 | Rust SQLite extension + 语言绑定 | 不只是 SQL 脚本,而是扩展能力 |
这里最该注意的是 WAL。honker 依赖 SQLite write-ahead log。worker 可以每 1ms 对 .db-wal 文件做一次 stat,用文件变化判断是否可能有新消息。
这个设计省掉了频繁执行完整 SQL 查询的开销。但它也划出了边界:这是接近实时,不是魔法实时;这是单机 SQLite 场景的工程技巧,不是分布式消息基础设施。
关键价值不是通知,而是 transactional outbox
很多小团队的问题,不是不会用消息队列。问题是消息队列来得太早。
业务数据在 SQLite。任务在 Redis。事件流又放到 Kafka 或 Postgres。架构图一复杂,故障面也跟着复杂。
最麻烦的是一致性。用户表更新成功了,消息没发出去。消息发出去了,事务却回滚了。工程师只能补重试、补幂等、补对账。最后为了一个发邮件任务,系统长出一套准分布式补偿逻辑。
honker 实现的是 transactional outbox pattern。消息先作为事务的一部分写入数据库。只有业务事务提交成功,任务才进入可消费状态。
这句话很朴素,但分量很重。它把“业务状态”和“后续动作”重新放回同一个事务边界里。
Brandur Leach 早写过 Postgres 里的 transactionally staged job drains。honker 的新意在于,把这条路带到了 SQLite 场景里。Simon Willison 评价它的设计看起来很扎实,但这仍只是设计层面的正面判断,不等于生产压测结论。
“天下熙熙,皆为利来。”技术选型也一样。引入 Kafka、Redis、Postgres 队列,不只是多装一个组件。你还买回了运维、监控、备份、故障恢复、团队认知成本。
honker 的吸引力就在这里:少买一套东西。对小系统来说,这不是寒酸,是克制。
谁该用,谁该观望
最该关注 honker 的,是两类人。
一类是用 SQLite 做本地优先应用、桌面应用、边缘节点、单机服务的开发者。你可以先评估 honker,而不是默认把 Redis 或 Kafka 加进部署清单。
另一类是小团队的工程负责人。若团队只是为了发邮件、生成报表、推 WebSocket 事件而引入新基础设施,可以把采购或迁移决策先按住。先问一句:任务和业务数据能不能留在 SQLite 的事务边界里?
但别把它用错。honker 目前不能被写成 Kafka、Postgres LISTEN/NOTIFY 或专业消息队列的替代品。原始材料没有给出吞吐数据、生产案例、语言绑定覆盖范围,也没有证明它具备分区、复制、跨节点容灾和成熟生态工具。
更现实的观察点有三条:
- 语言绑定覆盖到什么程度,是否匹配你的主栈。
- WAL 轮询在真实负载下的延迟和 CPU 成本如何。
- worker 崩溃、任务重试、长事务堆积、消费者落后时,行为是否可控。
这些才是 honker 从漂亮设计走向可靠工具的分水岭。队列一旦进入生产,就会遇到脏活。脏活处理得好,才叫基础设施。
历史上 SQLite 的成功,从来不是因为它假装自己是 Oracle。它赢在小、稳、近。honker 如果守住这个边界,就很有价值;如果开始讲“替代 Kafka”,味道就错了。
