honker 这个项目在 2026 年 4 月 24 日被 Simon Willison 记录下来:它给 SQLite 加上类似 Postgres NOTIFY/LISTEN、队列和 Kafka-style durable streams 的能力,形态是 Rust SQLite extension,外加多语言绑定。开发者可以在 Python 里写 queue/claim/ack,也可以在事务里 stream.publish(),再让消费者 subscribe()

我的判断很简单:这不是给 SQLite 硬贴 Kafka 光环。它补的是中小应用最缺的那颗螺丝——数据库提交和异步任务投递绑在一起,少掉一个分布式一致性的坑。对本地应用、单机服务、小团队后台、边缘部署来说,这比“再接一套消息队列”更现实。

honker 把 SQLite 变成了更完整的应用底座

honker 提供了三类能力:队列、通知、持久流。它还加入 20 多个自定义 SQL 函数,例如 notify('orders', '{"id":42}'),以及按偏移读取流的 honker_stream_read_since('orders', 0, 1000)

它的设计锚点很熟:Postgres 有 NOTIFY/LISTEN,Kafka 有 durable streams,RabbitMQ 和 Redis Streams 也能做异步任务。但 honker 的落点不同。它服务的是 SQLite 场景,不是跨机房、高吞吐、多分区的消息平台。

能力honker 的做法对开发者的影响边界
队列enqueue、claim、ackWorker 可以可靠领取任务不等于 RabbitMQ 集群
通知SQL 函数触发 notify应用内事件更轻不是严格实时总线
持久流stream publish/subscribe类 Kafka 的消费模型没有 Kafka 的规模承诺
事务绑定transactional outbox提交成功后任务才成立依赖 SQLite 运行模型

真正关键的是 transactional outbox。用户更新数据库、发布事件、入队任务,可以放在同一个事务语义里。事务失败,任务不成立;事务提交,任务才进入后续处理链路。很多小团队线上事故,正是死在“数据库写成功了,消息没发出去”这类缝隙里。

重要的不是更酷,而是少一套基础设施

小团队最怕的不是技术不先进,是系统还没长大,架构已经先肿了。一个后台服务,本来 SQLite 足够;为了发邮件、推 WebSocket、同步搜索索引,又拉 Kafka、Redis、Celery、监控和重试脚本。最后业务没复杂,运维复杂了。

honker 的价值在这里:让 SQLite 应用把“可靠异步”先在本地闭环。Python 示例里,邮件任务可以进入 queue,worker 用 claim('worker-1') 领取,处理完 ack();用户资料更新后,事件可以在同一个事务里 publish,再让 dashboard 订阅推送到浏览器。

这对两类人最直接:一是做桌面端、本地优先应用、边缘节点的开发者;二是小团队技术负责人。前者少造一套事件系统,后者少背一堆基础设施预算。架构的好处不是看起来像大厂,而是出问题时你能修得动。

历史上铁路、电力、报业都有类似阶段:基础设施一旦被过早集中化,小玩家就得先交“入场税”。技术世界也一样。“天下熙熙,皆为利来”,云服务、托管队列、事件平台当然有价值,但小系统未必该为大系统的叙事买单。

最该盯的是 WAL 模式和实时性边界

honker 要求 SQLite 开启 WAL 模式。它的 worker 可以每 1ms 对 .db-wal 文件做一次 stat 轮询,以接近实时地发现变化,避免每次都跑完整 SQL 查询。这是聪明的工程取舍,但别把它读成零延迟承诺。

这里有个容易被忽略的限制:SQLite 的强项是嵌入式、单文件、低运维成本;它不是为大规模分布式消息吞吐设计的。honker 没有让 SQLite 变成 Postgres,也没有让它变成 Kafka。它只是把 SQLite 原本能覆盖的产品半径向外推了一圈。

接下来该观察三件事:多语言绑定是否足够顺手;WAL 轮询在真实应用里的资源开销;失败恢复、重复投递、消费者积压这些细节是否经得起长期使用。原文没有给吞吐指标,也没有生产案例。现在能肯定的是设计方向清醒,不能肯定的是生产韧性已经被证明。

我更愿意把 honker 看成“小系统防塌方工具”,而不是“消息队列替代品”。它少讲宏大架构,多补真实缝隙。这种项目不性感,但开发者会记住。因为线上事故从不尊重架构图,只尊重事务边界。