
2025/12/30 4:58
**オベリスク 0.32:** - **キャンセル機能** - **WebAPI** - **PostgreSQL(Postgres)**
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
概要
Obelisk 0.32 は、ワークフローエンジンをより柔軟で堅牢にするための複数の新機能を導入します。
- 協調的キャンセル(Cooperative cancellation): ワークフローとアクティビティが親からキャンセルされた際に、タスクをきれいに停止できるようになり、分散サガで自然な補償操作を実現します。
- 多形式 WebAPI (プレーンテキストおよび JSON): gRPC だけでなく、HTTP 上のテキストも扱えるようになり、サーバーは gRPC / gRPC‑Web に加えてポート 5005 でテキスト通信を受け付けます。
- PostgreSQL サポート: マルチノードデプロイメントに対応し、高可用性構成が可能となります。これにより、単一障害点を排除し、仮想マシン間でスケールアップが容易になります。
- 新しいプレーンテキスト HTTP ポート (5005) が外部アクセスと設定を簡素化します。
主な詳細
- キャンセルは gRPC または WebAPI を通じて行われますが、対象は 葉アクティビティ と遅延リクエストのみです。ワークフロー全体のキャンセルはできません。
- アプリ起動時のワークフロー例では「すべてか無い」(all‑or‑nothing) のセマンティクスが示され、子プロセスの失敗がトップレベルでクリーニングをトリガーします。これにより協調的キャンセルの実際の動作が確認できます。
- PostgreSQL の設定は
に記述し、その利用により WASM コンポーネントを VM 間で分散させ、負荷に応じて動的にスケールアウトできるようになります。obelisk.toml
これらの拡張機能は、SQLite + Litestream バックアップと gRPC のみのキャンセルという以前の制限を克服し、Obelisk をより堅牢でスケーラブルなデプロイメントへと位置づけます。
本文
2025‑12‑29 – Obelisk 0.32
Obelisk 0.32 では、ワークフローとアクティビティの協調的なキャンセル機能、新しい WebAPI(複数フォーマットに対応)、およびマルチノード展開・高可用性を実現する PostgreSQL サポートが追加されました。
キャンセル
前回の発表で述べたように、Obelisk が呼び出す関数(ワークフローもアクティビティも)は 失敗し得る 必要があります。
v0.29.0 以降では永続的なスリープも含まれます。
これにより以下が可能になります:
- アクティビティと遅延要求のキャンセル
- ワークフロー内でのキャンセル処理をきれいに行う
workflow_support::sleep(ScheduleAt::In(SchedulingDuration::Seconds(10))) .map_err(|()| MyWorkflowError::Cancelled)?; some_activity::send_request() .map_err(|()| MyWorkflowError::Cancelled)?; // キャンセルとリトライの失敗を処理
キャンセルは gRPC または WebAPI(以下参照)で実行されます。
ワークフローをキャンセルする唯一の方法は、その 葉 ― アクティビティおよび遅延要求 ― をキャンセルすることです。
一部エンジンではワークフロー自体のキャンセルがサポートされていますが、次ステップで停止させると分散サガに必要なクリーンアップ/補償処理が行えません。
Obelisk は 協調的 なキャンセルをサポートし、補償処理を書きやすくします。
fn app_init( org_slug: String, app_name: String, obelisk_config: ObeliskConfig, init_config: AppInitConfig, ) -> Result<(), AppInitError> { // import を使ってサブワークフローを起動。 // いずれかのエラー(トラップ/パニック含む)でアプリ全体を削除。 workflow_import::prepare_volume(...) .map_err(|err| cleanup(...))?; workflow_import::wait_for_secrets(...) .map_err(|err| cleanup(...))?; workflow_import::start_final_vm(...) .map_err(|err| cleanup(...))?; workflow_import::wait_for_health_check(...) .map_err(|err | cleanup(...))?; Ok(()) }
app-init ワークフローは複数の子ワークフローを呼び、各々が HTTP アクティビティまたはスリープを実行します。子ワークフローや基盤となるアクティビティが失敗(要求拒否・パニック・キャンセル)した場合、エラーは上位に伝播し、トップレベルのワークフローは
cleanup を呼び出してすべてをロールバックします。
WebAPI
Obelisk サーバーは現在 5005 ポート でリッスンしています(以前は gRPC / gRPC‑Web のみ)。
v0.31.0 以降、このポートはテキストベースの HTTP も提供します。
curl 127.0.1:5005/v1/executions
サンプルレスポンス:
E_01KDJH6F811F2E0Q7AC4PDR9WE `Finished(ok)` obelisk-flyio:workflow/workflow@1.0.0-beta.app-init `23 hours ago` E_01KDG3JFCGDEM4E6MKD3M8QCS8 `Finished(execution completed with an error)` obelisk-flyio:workflow/workflow@1.0.0-beta.app-init `yesterday` ...
JSON 形式の出力もサポートしています。
curl 127.0.1:5005/v1/executions -H 'accept: application/json'
[ { "execution_id": "E_01KDJH6F811F2E0Q7AC4PDR9WE", "ffqn": "obelisk-flyio:workflow/workflow@1.0.0-beta.app-init", "pending_state": { "status": "Finished", "version": 16, "finished_at": "2025-12-28T13:09:50.226429459Z", "result_kind": "ok", "component_id_input_digest": "sha256:b2ee4bdf32367e5d4eaf3643b95b9d7261996a5fe03582bff58cc59a884dc29b" }, "created_at": "2025-12-28T13:08:38.274234577Z", "first_scheduled_at": "2025-12-28T13:08:38.274234577Z", "component_digest": "sha256:b2ee4bdf32367e5d4eaf3643b95b9d7261996a5fe03582bff58cc59a884dc29b" }, ... ]
PostgreSQL
Obelisk は当初から SQLite をサポートしており、ローカル開発や数秒のダウンタイムで再デプロイが許容される環境に最適です。
バックアップとリストアは Litestream により処理され、S3 互換エンドポイントを共有することで数百台の VM 上に展開できます。
PostgreSQL サポート は SQLite の制限を解消します:
- 非同期レプリケーションを扱い、VM がクラッシュした際に最後の数秒のコミット済みトランザクションが失われることを防止
- マルチノード展開を可能にし、WASM コンポーネントを VM 間で分散させて負荷に応じて動的スケール
- 単一障害点を排除し、高可用性を実現
obelisk.toml で PostgreSQL を設定します。
まとめ
- 協調キャンセル:ワークフローとアクティビティ(gRPC または WebAPI 経由)
- WebAPI:テキスト・JSON 応答をポート 5005 で提供
- PostgreSQL:マルチノード・高可用性展開と動的スケーリングを実現
これらの機能により、Obelisk はより堅牢かつ拡張性があり、開発者フレンドリーになりました。