
2026/04/30 23:43
耐久性のあるキュー、ストリーミング機能、パブリッシュ/サブスクライブ(Pub/Sub)、および Cron スケジューラーを、あなたの SQLite ファイルの内部に実装します。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Honker は、外部メッセージブローカーを必要としないよう、耐久タスクキュー、ストリーム、パブ/サブおよび cron スケジューラを SQLite ファイル内にネイティブ統合する軽量な SQLite 拡張機能です。内部バージョンカウンター(読み取り ~3µs)をポーリングすることで高価なファイルウォッチャーやリスナーごとのクエリに依存せず、サブミリ秒のレイテンシを実現し、アイドル時のコストはデータベースごとに約 1ms あたり軽量化された SELECT 1 回程度です。アーキテクチャにより、キューロジックをビジネスデータと緊密に結合するため、
INSERT INTO orders と queue.enqueue() が同一トランザクション内で原子コミットされ、ロールバックが発生した場合はキューイングタスクおよび関連するデータ行の双方が自動的にクリーンアップされます。高い同時処理能力に対応するために、単一のポーラースレッドがサブスクライバーにウェイクシグナルを扇形(ファン)で送信し、リスナー数の拡張が可能であり、データベース負荷を増やさず、ライターロック競合を引き起こしません。Python、Node、Rust、Go、Ruby、Bun、Elixir の 7 つの主要言語に加え、C++ および SQL をサポートするため、異なるスタック間で統一されたオンディスクフォーマットを共有でき、デュアル書き込みシステムの複雑性とコストを回避できます。Postgres 風の NOTIFY/LISTEN セマンティクスを実装し、M シリーズ搭載ラップトップでのクロスプロセスウェイクレイテンシは p50 で ~0.7ms です。q.claimによる非同期反復または Huey スタイルのデコレーター(@q.task)など、柔軟な消費パターンを提供します。実用採用が拡大しており、Bluesky の PDS、Fly の LiteFS、Turso などの主要プロジェクトで生产環境に統合されています。既存の PostgreSQL ユーザーには pg-boss や Oban などのネイティブ代替案への移行を推奨しますが、Honker は Redis + Celery スタックを追加する強力な代替手段であり、運用オーバーヘッドおよびデュアル書き込みの問題を効果的に排除します。本文
Honker: SQLite に基づく耐障害性の高いキューと Pub/Sub
概要
耐障害性の高いメッセージキュー、ストリーム、Pub/Sub、そして Cron スケジューラー——これらすべてが、たった一つの SQLite ファイルの中に実装されています。詳細については ドキュメント をご覧くださいか、または GitHub リポジトリ をご参照ください。
Honker は、SQLite への PostgreSQL 様式の
NOTIFY/LISTEN セマンティクスを追加することで、クライアントによるポーリングやデーモン/ブローカーが不要な耐障害性の高い Pub/Sub、タスクキュー、およびイベントストリームを実現します。M シリーズを搭載したノートパソコン上で実施されたテストでは、クロスプロセスの目覚め(起動)遅延は約 0.7 ms(p50)でした。
基本的なアーキテクチャ
基本的には、Honker は単なる SQLite 読み込み拡張モジュールです。
SELECT load_extension('honker_ext') を実行可能なあらゆる言語が、同じファイルにおける同じキュー、ストリーム、通知にアクセスできます。Python、Node、Rust、Go、Ruby、Bun、Elixir のバインディングには、すべて共通のオンディスク形式を採用しており、これにより同一ストレージ上の共有が可能となります。
現在、本格的な生産環境で動作している SQLite ベースのアプリケーションには、以下のシステムが含まれています:
- Bluesky の PDS(Personal Data Server)
- Fly 社の LiteFS
- Turso
- 数週間や数日間の週末プロジェクトとして始まり、最終的に本番環境に導入されたさまざまなアプリケーション
一度、ビジネスロジックが SQLite を背後としたアプリケーションを通じて実稼働した段階では、メッセージキューが必要になります。一般的には「Redis に Celery を追加する」という回答が与えられます。確かにそれは機能しますが、これにより以下のような課題が生じます:
- バックアップ戦略を別個に持つセカンダリなデータストアの導入
- ビジネステーブルとキュー間でのデュアルライト(同時書き込み)の問題
- ブローカーを運用するためのオーバーヘッド
Honker は、「SQLite が主たるデータストアである場合、キューも同じファイル内に配置されるべきだ」というアプローチをとっています。これは、
INSERT INTO orders と queue.enqueue(...) を同一のトランザクション内でコミットすることを意味します。ロールバックが発生した場合、両者はともに破棄されます。つまり、キューは単なるテーブルの行であり、部分インデックスによって管理されています。
使用例
アトミックなエンキュー
ビジネスロジックとの書込みを原子操作として実装し、その直後にコンシューム(消費)を行います。すべては同一の
.db ファイル内で動作しており、オンディスク形式も Python、Node、Rust、Go、Ruby、Bun、Elixir の 7 つの言語、さらに C++ および純粋な SQL エクステンションで共通しています。
Python(ホーンカー)例
import honkerdb db = honker.open("app.db") q = db.queue("emails") # ビジネス書込みと同じトランザクション内でエンキュー with db.transaction() as tx: tx.execute("INSERT INTO orders (id, total) VALUES (?, ?)", [42, 99]) q.enqueue({"to": "[email protected]", "order_id": 42}, tx=tx) # データベースへのコミットが発生した瞬間にワーカーが目覚めるため、ポーリング不要 async for job in q.claim("worker-1"): await send_email(job.payload) job.ack()
Huey 風のデコレーター(Python)
@q.task(retries=3, timeout_s=30) def send_email(to, subject): ... return {"sent_at": time.time()} r = send_email("[email protected]", "Hi") # エンキューされ、TaskResult が返される print(r.get(timeout=10)) # ワーカーが処理完了するまでブロックする
実装の詳細
目覚メカニズム(Wake Mechanism)
Honker は、毎ミリ秒ごとに SQLite の
PRAGMA data_version をポーリングします。これは、あらゆる接続、ジャーナルモード、あるいはプロセスからコミットが発生するたびに SQLite がインクリメントする単調増加カウンタです。正確な目覚めシグナルを実現するためには、読取コストが約 3 ユーロ秒(μs)で済みます。バックグラウンドスレッドがこのティックを各購読者にブロードキャストし、SELECT ... WHERE id > last_seen を実行して新しい行を出力します。
データベース1 つあたり、購読者数に関係なく、必ず 1 つのポーリングスレッドが存在します。アイドル状態のコストは、データベースあたり毎ミリ秒に1回の軽量な SELECT に過ぎません:
- ページキャッシュへの圧力なし
- ワイターロックによる競合なし
- カーネルレベルのファイルウォッチャーの介入なし
リスナーの数は無料拡張でスケーリングします。なぜなら、目覚めシグナルは「リスナーごとのクエリ」ではなく、「共有された1回のポーリング」であるためです。
ACID ガランティ
キュー、ストリーム、および Pub/Sub のプリミティブはすべて、拡張モジュールが管理するテーブルへの
INSERT 操作です。ビジネストランザクション内で queue.enqueue(payload, tx=tx) を呼び出すと、そのジョブ行もまた、それ以前に実行された INSERT INTO orders と同じ ACID プロパティを有します。ロールバックが発生すると、ジョブは他のすべての変更とともに破棄されます。
比較と代替手段
- pg_notify: クロスプロセストリガの高速化を提供しますが、再試行機能や可視化(Visibility)はありません。
- Huey: Honker の最も大きな影響を受けた対象であり、SQLite をバックエンドとする Python タスクキューです。
- pg-boss および Oban: PostgreSQL 側における業界標準ソリューションです。すでに PostgreSQL を運用環境として利用している場合は、これらを使用することをお勧めします。
Honker は、インフラストラクチャの簡素化を最優先とする環境をターゲットにしており、既存のデータベーススタックの内部で堅牢なメッセージングを提供します。