vanta / temporal-bundle
将 temporal 集成到 symfony
0.3.2
2024-07-16 14:55 UTC
Requires
- php: ^8.2
- symfony/dependency-injection: ^6.0|^7.0
- symfony/http-kernel: ^6.0|^7.0
- symfony/runtime: ^6.0|^7.0
- temporal/sdk: ^2.7
Requires (Dev)
- doctrine/doctrine-bundle: ^2.10
- doctrine/orm: ^2.15
- friendsofphp/php-cs-fixer: ^3.22
- nyholm/symfony-bundle-test: ^3.0
- phpstan/extension-installer: ^1.3
- phpstan/phpstan: ^1.10
- phpstan/phpstan-symfony: ^1.3
- phpunit/phpunit: ^10.3
- psr/log: ^3.0
- sentry/sentry-symfony: ^4.10
- symfony/monolog-bundle: ^3.8
- symfony/serializer: ^6.0|^7.0
- symfony/web-profiler-bundle: ^6.0|^7.0
- vanta/temporal-sentry: ^0.1.1
Suggests
- vanta/temporal-sentry: Integration for sentry
README
Temporal 是一种简单、可扩展的开源方式,用于编写和运行可靠的云应用程序。
特性
- Sentry:发送可抛出的事件(如果使用
SentryBundle
) - Doctrine:清除打开的管理器,并在每次请求后检查连接是否仍然可用(如果使用
DoctrineBundle
) - Serializer:反序列化和序列化消息(如果使用
Symfony/Serializer
,强烈推荐)
要求
- php >= 8.2
- symfony >= 6.0
安装
- 连接配方
composer config --json extra.symfony.endpoint '["https://raw.githubusercontent.com/VantaFinance/temporal-bundle/main/.recipie/index.json", "flex://defaults"]'
- 安装包
composer req temporal serializer
-
配置 docker-compose-temporal.yml/Dockerfile
-
添加 Workflow/Activity。查看 示例 以开始。
Doctrine 集成
如果使用 DoctrineBundle
,以下最终化器可供您使用
temporal.doctrine_ping_connection_<entity-mananger-name>.finalizer
temporal.doctrine_clear_entity_manager.finalizer
拦截器
temporal.doctrine_ping_connection_<entity-mananger-name>_activity_inbound.interceptor
示例配置
temporal: defaultClient: default pool: dataConverter: temporal.data_converter roadrunnerRPC: '%env(RR_RPC)%' workers: default: taskQueue: default exceptionInterceptor: temporal.exception_interceptor finalizers: - temporal.doctrine_ping_connection_default.finalizer - temporal.doctrine_clear_entity_manager.finalizer interceptors: - temporal.doctrine_ping_connection_default_activity_inbound.interceptor clients: default: namespace: default address: '%env(TEMPORAL_ADDRESS)%' dataConverter: temporal.data_converter cloud: namespace: default address: '%env(TEMPORAL_ADDRESS)%' dataConverter: temporal.data_converter clientKey: '%env(TEMPORAL_CLIENT_KEY_PATH)%' clientPem: '%env(TEMPORAL_CLIENT_CERT_PATH)%'
Sentry 集成
安装包
composer require sentry temporal-sentry
如果使用 SentryBundle
,以下拦截器可供您使用
temporal.sentry_workflow_outbound_calls.interceptor
temporal.sentry_activity_inbound.interceptor
示例配置
temporal: defaultClient: default pool: dataConverter: temporal.data_converter roadrunnerRPC: '%env(RR_RPC)%' workers: default: taskQueue: default exceptionInterceptor: temporal.exception_interceptor interceptors: - temporal.sentry_workflow_outbound_calls.intercepto - temporal.sentry_activity_inbound.interceptor clients: default: namespace: default address: '%env(TEMPORAL_ADDRESS)%' dataConverter: temporal.data_converter
分配工作线程
使用不同的任务队列运行 workflows 和 activities。将 AssignWorker
属性添加到您的 Workflow 或 Activity 中,指定工作线程的名称。此 Workflow 或 Activity 将由指定的线程处理。
工作流程示例
<?php declare(strict_types=1); namespace App\Workflow; use Vanta\Integration\Symfony\Temporal\Attribute\AssignWorker; use Temporal\Workflow\WorkflowInterface; #[AssignWorker(name: 'worker1')] #[WorkflowInterface] final class MoneyTransferWorkflow { #[WorkflowMethod] public function transfer(...): \Generator; #[SignalMethod] function withdraw(): void; #[SignalMethod] function deposit(): void; }
活动示例
<?php declare(strict_types=1); namespace App\Workflow; use Vanta\Integration\Symfony\Temporal\Attribute\AssignWorker; use Temporal\Activity\ActivityInterface; use Temporal\Activity\ActivityMethod; #[AssignWorker(name: 'worker1')] #[ActivityInterface(...)] final class MoneyTransferActivity { #[ActivityMethod] public function transfer(...): int; #[ActivityMethod] public function cancel(...): bool; }
待办事项
- E2E 测试
- 文档