vanta/temporal-bundle

将 temporal 集成到 symfony

安装次数: 2,340

依赖者: 0

建议者: 0

安全: 0

星标: 8

关注者: 0

分支: 5

公开问题: 1

类型:symfony-bundle

0.3.2 2024-07-16 14:55 UTC

This package is auto-updated.

Last update: 2024-09-16 15:15:34 UTC


README

Temporal 是一种简单、可扩展的开源方式,用于编写和运行可靠的云应用程序。

特性

  • Sentry:发送可抛出的事件(如果使用 SentryBundle
  • Doctrine:清除打开的管理器,并在每次请求后检查连接是否仍然可用(如果使用 DoctrineBundle
  • Serializer:反序列化和序列化消息(如果使用 Symfony/Serializer,强烈推荐)

要求

  • php >= 8.2
  • symfony >= 6.0

安装

  1. 连接配方
composer config --json extra.symfony.endpoint '["https://raw.githubusercontent.com/VantaFinance/temporal-bundle/main/.recipie/index.json", "flex://defaults"]' 
  1. 安装包
composer req temporal serializer
  1. 配置 docker-compose-temporal.yml/Dockerfile

  2. 添加 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 测试
  • 文档