プログラミング
Show HN: DBOSify – Postgres上に構築されたドロップイン可能なTemporal代替
Show HN: DBOSify – Drop-in Temporal replacement built on Postgres (github.com)
要約
DBOSifyは、Temporalサーバーの代わりにPostgresを使用するTemporal Pythonのドロップイン代替ライブラリです。これにより、Postgres以外のインフラを必要とせずに、耐久性のあるワークフロー、アクティビティ、シグナル、更新、リトライ、リカバリを実行できます。本ライブラリは、既存のTemporal Pythonアプリケーションに簡単に統合でき、主要なTemporal機能の互換性と信頼性を維持しつつ、シンプルなPostgresベースのバックエンドを提供します。
全文翻訳
DBOSifyは、Temporalサーバーの代わりにPostgres(DBOS Transactを介して)を使用するTemporal Pythonのドロップイン代替ライブラリです。これにより、Postgres以外のインフラを必要とせずに、耐久性のあるワークフロー、アクティビティ、シグナル、更新、リトライ、リカバリを実行できます。このライブラリを使用するには、temporalioの代わりにdbosifyをインポートし、ワーカーとクライアントをPostgresデータベースに接続します。
**使用方法**
インストールするには:
pip install dbosify
これはドロップイン代替です: temporalioの代わりにdbosifyをインポートし、クライアントとワーカーをTemporalサーバーの代わりにPostgresデータベースに接続するだけです。詳細なドキュメントはこちら。
```python
import asyncio
import os
from datetime import timedelta
from dbosify import activity, workflow
from dbosify.client import Client
from dbosify.worker import Worker
# Set this to a connection string to your Postgres database
DB_URL = os.environ.get("DBOS_SYSTEM_DATABASE_URL")
@activity.defn
async def compose_greeting(name: str) -> str:
return f"Hello, {name}!"
@workflow.defn
class GreetingWorkflow:
@workflow.run
async def run(self, name: str) -> str:
return await workflow.execute_activity(
compose_greeting,
name,
start_to_close_timeout=timedelta(seconds=10)
)
async def main() -> None:
worker = Worker(
DB_URL,
task_queue="greetings",
workflows=[GreetingWorkflow],
activities=[compose_greeting],
)
async with worker:
async with await Client.connect(DB_URL) as client:
result = await client.execute_workflow(
GreetingWorkflow.run,
"World",
id="greeting-1",
task_queue="greetings"
)
print(result) # Hello, World!
if __name__ == "__main__":
asyncio.run(main())
```
**仕組み**
DBOSifyは、各TemporalワークフローをPostgresにバックアップされたDBOSワークフローとして実行します。決定論的インタプリタは、イベントが到着したときにのみ進む仮想イベントループ上でワークフロー(そのメインコルーチンと、シグナル、更新、クエリハンドラの両方)を実行します。DBOSのステップとワークフロー通信プリミティブを使用することで、すべての非決定論的アクションは、ワークフローがそれらを観測する前にPostgresにチェックポイントされます。アクティビティとタイマーはDBOSのステップと耐久性のあるスリープとなり、それぞれ完了時にチェックポイントされます。シグナル、更新、キャンセルは、LISTEN/NOTIFYを使用してPostgresを介して配信される耐久性のあるメッセージです。リカバリは、新しいワーカーでワークフローを再実行します。インタプリタは記録されたチェックポイントに対して同じ一連の操作をリプレイするため、実行は中断した箇所から再開され、正確に一度だけ完了します。
名前空間はそれぞれ独自のPostgresスキーマにマップされます。クライアントはDBOSクライアントをラップし、ワーカーはDBOSランタイムをラップします。
**テスト方法**
DBOSifyはTemporalのドロップイン代替であるため、以下の戦略を使用して、Temporalとの正確性と適合性の両方をテストでカバーしています。
* すべての関連するTemporal Pythonユニットテストと統合テストの移植版
* 関連するTemporal Pythonサンプルアプリケーションの移植版。DBOSifyがドロップイン代替であることを検証
* 新しいユニットテストと統合テスト。決定論的な障害回復を検証するキルアンドリカバリテストに重点
* シグネチャパリティテスト。これらのライブラリのパブリックAPIが同一であることを機械的に確認(文書化された例外あり)
**これは何ではないのか**
* **ワイヤプロトコルの互換性はありません。** gRPCワイヤ互換性はありません。他の言語のTemporal SDKは接続できません。これは、Pythonのみのアプリケーション向けにTemporalサーバーとPython SDKを完全に置き換えるものです。
* **Temporal Web UI、temporal CLI、tctlはありません。** ワークフローはDBOSのワークフロー管理APIとDBOS Conductorで操作します。アーキテクチャの違いと機能の互換性については、このドキュメントを参照してください。