文章摘要
Honker是一个SQLite扩展,为SQLite文件添加了持久队列、流、发布/订阅和定时任务功能,无需额外代理服务。它采用与Postgres类似的NOTIFY/LISTEN机制,跨进程延迟低至0.7毫秒。支持多种编程语言绑定,所有操作都在同一个SQLite文件中完成,避免了引入Redis等额外存储带来的运维复杂度,确保业务数据和队列操作保持事务一致性。
文章总结
标题:Honker - 基于SQLite的持久队列与消息系统
核心功能: - 在SQLite文件中实现持久队列、流式处理、发布/订阅模式和定时任务调度 - 为SQLite添加类似PostgreSQL的NOTIFY/LISTEN功能 - 无需客户端轮询或中间代理服务,跨进程唤醒延迟仅约0.7毫秒(M系列笔记本测试数据)
技术特点:
1. 原生集成
- 作为SQLite可加载扩展实现,支持任何能调用SELECT load_extension('honker_ext')的编程语言
- 提供Python/Node/Rust/Go/Ruby/Bun/Elixir等多语言绑定
- 所有语言共享相同的磁盘存储格式
- 设计优势
- 业务写入与队列操作原子性提交(示例:订单创建与邮件任务入队同一事务)
- 事务回滚时自动清除关联队列任务
- 底层实现为带有部分索引的表数据
- 高效通知机制
- 通过监控SQLite的
PRAGMA data_version实现毫秒级变更检测(约3微秒读取) - 单数据库单轮询线程设计,不受监听器数量影响
- 空闲时仅维持轻量级查询,无页面缓存压力
使用场景: - 替代传统Redis+Celery方案,避免: * 多数据存储的备份复杂性 * 业务表与队列的双写问题 * 中间件运维成本 - 适合已采用SQLite作为主数据库的应用(如Bluesky PDS、LiteFS等)
开发接口示例: ```python
基础队列操作
with db.transaction() as tx: tx.execute("INSERT INTO orders...") q.enqueue({"to":"alice@example.com"}, tx=tx)
任务装饰器(类似Huey)
@q.task(retries=3) def send_email(to):... ```
对比同类产品: - 相比PostgreSQL的pg_notify:增加重试和可见性机制 - 类似Python的Huey、Postgres的pg-boss/Oban,但深度集成SQLite
安装方式:
pip install honker(Python示例)
(注:移除了重复的技术栈列表和次要实现细节,保留核心架构说明和典型用法示例)
评论总结
以下是评论内容的总结:
技术实现讨论
- 支持观点:认为该技术方案有趣且适合新项目,通过毫秒级轮询SQLite的PRAGMA data_version实现高效唤醒(评论2:"It’s an interesting approach... a ~3 µs read for a precise wake signal")
- 反对观点:认为忙轮询SELECT不如内核文件监视器高效(评论4:"busy-polling a select does not actually sound better... than a kernel file watcher")
与其他工具对比
- 指出Oban已支持SQLite,可能比文中提到的方案更成熟(评论3:"Oban supports SQLite now too")
- 类比Litestack的失败案例,暗示Rails生态对SQLite的兼容性问题(评论5:"Reminds me of Litestack... abandoned because Rails... going all out on SQLite")
实用性质疑
- 认为SQLite缺乏并发性,实际应用会存在问题(评论7:"SQLite is not concurrent... tons of problems using it practically")
- 建议作者在空闲时降低轮询频率以优化性能(评论10:"Suggestion... wind back the polling to once a second")
性能与适用场景
- 要求提供基准测试数据(评论8:"I can’t see any benchmarks... like to see messages per second")
- 认为该方案适合中等规模场景,介于内存队列与Kafka之间(评论9:"appealing in the awkward middle... not big enough to justify Kafka")
其他技术问题
- 询问是否兼容Turso(SQLite的Rust重写版)(评论6)
- 提供先前讨论的链接(评论1)
(注:所有评论评分均为None,未体现社区认可度差异)