Honker – SQLiteファイル内の耐久性のあるキュー、ストリーム、パブ/サブ、及びcronスケジューラー
16時間前原文(honker.dev)
概要
honkerは、SQLiteファイル内で耐障害性キュー、ストリーム、pub/sub、cronスケジューラを提供。
Postgres風のNOTIFY/LISTENを実現し、追加ミドルウェアやデーモン不要。
複数言語対応で同一ファイル・同一フォーマットを共有。
トランザクション一貫性で、ビジネスデータとキュー操作を同時に管理可能。
運用コスト削減と低レイテンシを両立。
honker:SQLiteで実現する耐障害性キュー・ストリーム・Pub/Sub・Cron
- honkerは、SQLiteファイルに耐障害性キュー、ストリーム、pub/sub、cronスケジューラを統合
- PostgresのNOTIFY/LISTENのような通知セマンティクスをSQLiteにもたらす
- クライアント側ポーリング不要、デーモンやブローカー不要の設計
- クロスプロセスのウェイクレイテンシは**約0.7ms(MシリーズMac)**の高速応答
- SQLite拡張として提供、どの言語でも
SELECT load_extension('honker_ext')で利用可能 - Python、Node、Rust、Go、Ruby、Bun、Elixirバインディングが共通オンディスクフォーマットを共有
SQLiteを主データストアとする利点
- Bluesky’s PDS、Fly’s LiteFS、Tursoなど実運用例多数
- SQLite利用アプリでは耐障害性キューが不可欠
- 従来はRedis+Celeryなどを追加導入し、二重管理や運用負荷増加が発生
- honkerは「キューも同一SQLiteファイル内」という設計思想
- INSERT INTO ordersとqueue.enqueue(...)が同一トランザクションで実行
- ロールバック時は両方とも巻き戻し、一貫性確保
- キューはテーブルの行として管理、パーシャルインデックスで高速アクセス
マルチ言語・シンプルなAPI
- 同一.dbファイル・同一フォーマットで7言語サポート
- Python、Node、Rust、Go、Ruby、Bun、Elixir、C++、SQL(拡張)
- Python例
- 同一トランザクションでビジネスデータとキュー投入
- ワーカーはコミット時に自動ウェイク、ポーリング不要
- Huey風デコレータでタスク定義・再試行・タイムアウトも簡単
内部動作とパフォーマンス
- PRAGMA data_versionを1msごとにポーリング
- SQLiteのコミットごとにインクリメントされる単調カウンタを利用
- 3μsで読めるため高効率なウェイク信号
- 1データベース1ポーラースレッド、リスナー数が増えても負荷一定
- SELECTのみでページキャッシュ負荷・ロック競合なし
- リスナー数増加によるスケールも容易
ACIDトランザクションと拡張性
- キューやストリーム、pub/subは拡張が管理するテーブルへのINSERT
- queue.enqueue(payload, tx=tx)でビジネスロジックと同一トランザクション
- ロールバック時はジョブも同時に消去、整合性維持
- pg_notifyは高速だがリトライや可視性なし
- Huey(SQLiteバックエンドPythonタスクキュー)から多くを参考
- pg-boss、ObanはPostgres向け標準、Postgres利用者はそちら推奨
導入方法
- Python例:
pip install honker - **Node、Rust、Go、Ruby、Bun、Elixir、C++**等でも利用可能
- SQLite拡張として既存ワークフローに容易に統合
honker導入による運用コスト削減と一貫性の強化
- 追加ミドルウェア不要による運用・保守コスト削減
- ビジネスデータとキューの同時管理でデータ一貫性を実現
- 低レイテンシ・高スケーラビリティで本番運用にも最適
- SQLiteを主データストアとするアプリにおける耐障害性キューの最適解