基于Rust的SQLite扩展实现Postgres风格通知功能
Simon Willison··作者 Simon Willison
关键信息
honker要求SQLite启用WAL模式,并通过每1毫秒检查一次.db-wal文件来高效检测变化;它实现了事务性出站模式,确保只有在事务成功提交后才将消息加入队列。
资讯摘要
'honker'项目由Russell Romney开发,通过Rust扩展为SQLite添加了Postgres风格的通知功能。开发者可以使用类似`queue.enqueue()`和`stream.publish()`的语法,在Python中直接创建异步队列和持久事件流。该扩展支持任务队列和类似Kafka的流,内置SQL函数如`notify()`和`honker_stream_read_since()`。
工作者可通过轮询WAL文件实现接近实时的更新,而无需昂贵查询。它采用事务性出站模式确保数据一致性,适合需要可靠性和简洁性的应用场景。
资讯正文
russellromney/honker
这是一个为SQLite实现的Postgres NOTIFY/LISTEN语义的项目,通过Rust编写的SQLite扩展及多种语言绑定,帮助用户更好地使用该功能。
这个设计看起来非常扎实。它让你可以用Python编写队列代码,就像这样:
import honker
db = honker.open("app.db")
emails = db.queue("emails")
emails.enqueue({"to": "alice@example.com"})
# 在工作进程中消费
async for job in emails.claim("worker-1"):
send(job.payload)
job.ack()
还可以实现类似Kafka的持久化数据流:
stream = db.stream("user-events")
with db.transaction() as tx:
tx.execute("UPDATE users SET name=? WHERE id=?", [name, uid])
stream.publish({"user_id": uid, "change": "name"}, tx=tx)
async for event in stream.subscribe(consumer="dashboard"):
await push_to_browser(event)
此外,它还添加了20多个自定义SQL函数,包括以下两个:
SELECT notify('orders', '{"id":42}');
SELECT honker_stream_read_since('orders', 0, 1000);
该扩展要求启用 WAL 模式,工作者可以每毫秒通过 stat 系统调用轮询 .db-wal 文件,从而尽可能接近实时,而无需运行完整 SQL 查询的开销。
honker 实现了<strong>事务性出站消息队列模式</strong>,确保只有在事务成功提交后,项目才会被放入队列。我对这一模式最欣赏的解释仍然是 Brandur Leach 的《Postgres 中的事务性作业排空》。看到 SQLite 上有了这种模式的新实现,非常令人兴奋。
Tags: databases, postgresql, sqlite, rust
来源与参考
收录于 2026-04-25