Temporal 是一个开源的工作流引擎,它以分布式的方式管理和执行可靠、持久且容错的工作流。但要在 PHP 中使用它,唯一的方法是结合 RoadRunner。它使得将你的 PHP 应用与 Temporal 集成变得超级简单,你可以立即开始使用它。
关于 Temporal 的一个很酷的事情是,你可以使用任何支持的语言编写你的工作流和活动。例如,你可以有一个用 PHP 编写的工作流,但用 Go 或其他语言编写的代码来处理某些活动。如果你的团队对语言有不同的偏好,或者你想利用不同语言在不同任务上的优势,这会非常有帮助。
当你需要管理复杂的数据流或确保跨多个业务域的可靠事务处理时,可以使用 Temporal。它提供了计时器、重试机制等等。
要在你的 PHP 项目中使用 Temporal,你需要安装 spiral/temporal-bridge
包。
步骤如下:
composer require spiral/temporal-bridge
安装完该包后,你需要使用引导器来激活该组件:
public function defineBootloaders(): array
{
return [
// ...
\Spiral\TemporalBridge\Bootloader\TemporalBridgeBootloader::class,
// ...
];
}
在 框架 — 引导器 部分阅读更多关于引导器的信息。
要快速开始使用 Temporal,可以使用开发服务器。
首先,安装 Temporal CLI - 按照 Temporal 网站 上的说明进行操作。
安装 CLI 后,你可以通过运行以下命令来启动 Temporal 服务器:
temporal server start-dev
注意 还有其他启动 Temporal 服务器的方法。例如,你可以使用 Docker。你可以在 Temporal 存储库 中找到 docker-compose 文件。
你只需要在 .env
文件中指定你的 Temporal 服务器的地址:
TEMPORAL_ADDRESS=127.0.0.1:7233
如果你想精确地配置你的应用程序,你可以创建 temporal.php
配置文件。在那里,你可以指定选项,如任务队列、命名空间和单个工作器配置。
以下是一个配置文件的示例:
use Spiral\TemporalBridge\Config\ConnectionConfig;
use Spiral\TemporalBridge\Config\ClientConfig;
use Temporal\Worker\WorkerFactoryInterface;
use Temporal\Worker\WorkerOptions;
return [
'client' => env('TEMPORAL_CONNECTION', 'default'),
'clients' => [
'default' => new ClientConfig(
new ConnectionConfig(
address: env('TEMPORAL_ADDRESS', 'localhost:7233'),
),
),
],
'defaultWorker' => WorkerFactoryInterface::DEFAULT_TASK_QUEUE,
'workers' => [
'workerName' => WorkerOptions::new(),
],
];
clients
选项包含一个命名的 ClientConfig
设置列表,用于每个客户端。默认客户端的名称在 client
选项中指定。
ClientConfig
包含连接到 Temporal 服务器、gRPC 上下文设置和客户端设置。这些设置将在创建 Temporal 工作流和计划客户端时使用。
在连接设置中,你可以指定 Temporal 服务器地址、TLS 设置和其他凭据,例如身份验证令牌。顺便说一下,身份验证令牌也接受 \Stringable
类型,所以你可以在运行时更改其值,而无需重启工作器。
如果你需要指定自定义 Temporal 命名空间或身份,请自定义 ClientOptions
。
使用上下文,你可以指定超时、RPC 调用重试设置以及与请求一起发送的元数据。
一个例子:
use Spiral\TemporalBridge\Config\TlsConfig;
use Spiral\TemporalBridge\Config\ConnectionConfig;
use Spiral\TemporalBridge\Config\ClientConfig;
use Temporal\Client\ClientOptions;
use Temporal\Client\Common\RpcRetryOptions;
use Temporal\Client\GRPC\Context;
return [
// ...
'clients' => [
'default' => new ClientConfig(
connection: new ConnectionConfig(
address: 'foo-bar-default.baz.tmprl.cloud:7233',
tls: new TlsConfig(),
authToken: 'my-secret-token',
),
options: (new ClientOptions())
->withNamespace('default')
->withIdentity('customer-service'),
context: Context::default()
->withTimeout(4.5)
->withRetryOptions(
RpcRetryOptions::new()
->withMaximumAttempts(5)
->withInitialInterval(3)
->withMaximumInterval(10)
->withBackoffCoefficient(1.6)
),
];
工作器选项用于配置 Temporal 工作器行为的各个方面。
WorkerOptions
类有助于有效地管理系统资源。这对于维护系统稳定性和效率至关重要,尤其是在高负载场景中。你可以为每个任务队列定义工作器选项。例如:
use Temporal\Worker\WorkerOptions;
return [
// ...
'workers' => [
'workerName' => WorkerOptions::new(),
'default' => WorkerOptions::new()
->withMaxConcurrentActivityExecutionSize(10)
->withWorkerActivitiesPerSecond(100),
],
];
还有一种定义工作器选项的替代方法。例如:
use Temporal\Worker\WorkerOptions;
return [
// ...
'workers' => [
'workerName' => [
'options' => WorkerOptions::new(),
'exception_interceptor' => new ExceptionInterceptor(),
]
],
];
使用这种方法,你可以另外定义一个异常拦截器。在 Temporal — 拦截器 部分阅读更多关于拦截器的信息。
拦截器用于拦截工作流和活动调用。它们可以用于向调用过程添加自定义逻辑,例如日志记录或指标收集。
在 Temporal — 拦截器 部分阅读更多关于拦截器的信息。
在你的 RoadRunner 配置文件 .rr.yaml
中,添加一个 temporal
部分。这允许你设置服务器地址和工作器数量。
例如:
...
temporal:
address: ${TEMPORAL_ADDRESS:-localhost:7233}
activities:
num_workers: 10
有关使用 RoadRunner 配置 Temporal 的更多详细信息,请阅读 RoadRunner 文档。
如果你想使用 Temporal Cloud,你必须配置一个安全连接和一个特定的命名空间。
use Spiral\TemporalBridge\Config\TlsConfig;
use Spiral\TemporalBridge\Config\ConnectionConfig;
use Spiral\TemporalBridge\Config\ClientConfig;
use Temporal\Client\ClientOptions;
return [
'client' => 'production',
'clients' => [
'production' => new ClientConfig(
connection: new ConnectionConfig(
address: 'foo-bar-default.baz.tmprl.cloud:7233',
tls: new TlsConfig(
privateKey: '/my-project.key',
certChain: '/my-project.pem',
),
),
options: (new ClientOptions())
->withNamespace('foo-bar-default.baz'),
],
// ...
];
...
temporal:
address: foo-bar-default.baz.tmprl.cloud:7233
namespace: foo-bar-default.baz
tls:
key: /my-project.key
cert: /my-project.pem
就是这样!祝你工作流构建愉快!