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 / ackworker 可领取任务并确认完成
持久流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”,味道就错了。