概要
- Postgres を活用したワークフロー管理の新提案
- アプリケーションデータとワークフローステートの 同居 による利点の説明
- トランザクション で実現する冪等性と原子性の簡素化
- Transactional Outbox パターンの課題と解決策
- DBOSによる Postgresワークフローエンジン の紹介
Postgresでワークフロー管理を統合する利点
- アプリケーションデータ と ワークフローステート を同じPostgresデータベースに格納する提案
- 一見、関心事の分離が必要に思えるが、 分散システム ではデータの共存が大きな強み
- ワークフローメタデータとアプリケーションデータを 同一トランザクション で更新可能
- 部分的な失敗が発生しないため、エッジケースの対応が容易
- トランザクションで冪等性や原子性の課題を シンプルに解決 可能
トランザクションで実現する冪等性
- 分散システム における大きな課題は冪等性の確保
- ワークフローは各ステップの チェックポイント を記録し、途中中断時は直前のステップから再開
- しかし、処理完了後にチェックポイント記録前に中断すると、再実行時に 重複処理 が発生
- 従来はアプリケーション側で bookkeepingテーブル を用意し、二重処理を防止
- 例:applied_paymentsテーブルで支払いの重複を管理
- ワークフロー状態とアプリケーションデータの同居 により、複雑なbookkeepingが不要
- ワークフローエンジンが提供するトランザクションで、データ更新とチェックポイント記録を 同時にコミット
- トランザクションがコミットされれば、 処理とチェックポイントが確実に記録
- コミット前に失敗した場合は全てロールバック
- アプリケーション側で冪等性ロジックや管理テーブルが不要となり、 exactly-once実行保証
トランザクション・ワークフローアウトボックスによる原子性
- 複数システム 間での原子性確保も分散システムの難題
- 例:注文データベース更新と外部通知の同時実行
- 従来は Transactional Outboxパターン を採用
- アウトボックステーブルにメッセージを書き込み、別プロセスで通知
- 一つのトランザクションでデータ更新とアウトボックス書き込みを実現
- この方式は 運用負荷 が高く、ポーリングやリトライ、監視が必要
- ワークフローエンジンが別システムの場合、同期ズレや追加インフラが発生
- Postgres UDF を活用し、アプリケーションデータ更新とワークフローキューへの登録を 同一トランザクション で実行
- enqueue_workflow UDFでワークフロー行を作成
- 更新とキューイングの 原子性 を保証
- ワーカーが非同期でワークフローを実行し、信頼性を担保
Postgresワークフローエンジンの今後
- DBOS は、Postgresベースの耐障害性ワークフロー実行を シンプルかつ高性能 に実現することを目指す
- スケーラブルかつ信頼性の高いシステム構築に興味がある方への案内
- Quickstart: https://docs.dbos.dev/quickstart
- GitHub: https://github.com/dbos-inc
- Discordコミュニティ: https://discord.gg/eMUHrvbu67