bernardwiesner / laravel-gcp-pubsub
PHP 的 Google Cloud Pub/Sub 包装器
Requires
- php: >=7.2
- google/cloud-pubsub: ^1.38
- illuminate/support: 5.7.* | 5.8.* | ^6.0 | ^7.0 | ^8.0 | ^9.0
Requires (Dev)
- phpunit/phpunit: ^9.5
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');