bernardwiesner/laravel-gcp-pubsub

PHP 的 Google Cloud Pub/Sub 包装器

v1.0 2022-09-15 06:22 UTC

This package is auto-updated.

Last update: 2024-09-07 15:53:39 UTC


README

PHP 的 Google Cloud PubSub 包装器

此包装器提供了一个便捷的流畅 API,并具有一些有用的功能,如超时、重试和延迟 API 方法。它还提供了一个用于测试的模拟外观。

使用此包的推荐方法是在 Laravel 中设置一个 PubSub API,该 API 处理来自 GCP pubsub 的 推送 订阅事件。然后您可以从 Laravel 中的任何微服务中 发布 主题到 GCP pubsub,GCP 将调用您配置的 推送 订阅端点(API)以处理作业。这是使用 Laravel 队列处理后台作业的替代方案。

使用此包而不是 laravel queue 的优点是,您可以轻松地通过添加更多服务器或容器来扩展您的 API。另一个重大优点是它将作业与代码解耦,不需要在发布/发布的同一存储库中定义作业,允许更友好的微服务架构。您甚至可以在微服务中使用除 PHP/Laravel 之外的语言处理作业。

有关如何在 Laravel 中设置 PubSub API 的更多详细信息,请参阅 本指南

安装

composer require bernardwiesner/laravel-gcp-pubsub

发布配置

如果您想调整重试尝试,或修改其他配置,应发布配置

php artisan vendor:publish --tag=gcp-pubsub

传输协议

默认情况下,包装器使用 http 1.1 REST。我已经测试过 gRPC 并观察到响应速度较慢。如果您想使用 gRPC,可以修改 gcp-pubsub.php 配置文件中的 transport

<?
return [
    // rest or grcp
    'transport' => 'grcp',
    // ...
];

重试

GCP PubSub 允许您在客户端配置 重试,但是此功能仅在特定的响应代码上工作。此包的 重试 设置在 GCP 的任何失败请求上都有效,包括超时。默认情况下,重试设置为 2 次,延迟为 100 毫秒。您可以在 gcp-pubsub.php 文件中修改这些默认值

<?
return [
    // How many times to retry the request when it fails
    'retry' => 2,
    // How many milliseconds to wait after retry fails
    'retry_wait' => 100
];

流畅 API

您可以使用流畅语法来链式调用 API

    use PubSub;
    // ...
    PubSub::topic('your-topic')
    ->delaySeconds(30)
    ->publish(['your data'], [
        "your-attribute" => "your-value"
    ]);

发布

发布 接受两个参数,都是数组。第一个是必需的 data 消息,第二个是可选的 attributes 消息(请参阅 GCP pubsub 上的 消息格式。此包将始终对 data 参数进行 json 编码,如果使用 rest,则进行 base64 编码,因此您需要在从 GCP pubsub 接收事件时对 data 进行 json_decode 和 base64_decode。例如,如果您使用 pubsub 上的 推送 订阅,则您的 Laravel 控制器应按以下方式解码:

class YourController extends Controller
{
    public function __invoke(Request $request): HttpResponse
    {
        $message = $request->message;
        $data = json_decode(base64_decode($message['data']), true);
    }
}

延迟秒数

这将向请求有效载荷添加一个名为 available_at 的属性。您可以使用此属性来确定作业是否应该进行处理。例如,如果您将 GCP pubsub 订阅配置为 推送,则可以在您的 API 中检查 available_at 属性并在时间尚未到达时提前返回。

这是一个您可以使用来提前返回的中间件示例

    public function handle(Request $request, Closure $next)
    {
        $availableAt = (int) ($request->message['attributes']['available_at'] ?? 0);
        if ($availableAt > time()) {
            return response()->noContent(409);
        }
        return $next($request);
    }

不使用流畅 API

您还可以选择不使用流畅 API 并调用底层 API

    use PubSub;
    // ...
    PubSub::publish('test-topic', [
        'data' => ['foo' => 1],
        'attributes' => [
            'bar' => 2,
        ]
    ], $delaySeconds = 10);

测试

您可以在测试中通过以下方式来模拟 PubSub 门面:

PubSub::fake();

您还可以通过以下方式验证发布的主题:

$this->assertEquals(1, count(PubSub::getPublished()));

您还可以断言单个主题被发布到:

PubSub::assertPublished('your-topic');