pruvo/laravel-google-cloud-tasks-queue

使用 Google Cloud Tasks 和 Google Cloud Run 的 Laravel 服务器端无服务器队列。

此包的官方仓库似乎已消失,因此该包已被冻结。

v1.2.0 2023-01-31 19:01 UTC

This package is auto-updated.

Last update: 2024-03-29 04:46:43 UTC


README

logo.png

Build Status Latest Stable Version License

介绍

此包允许您将 Google Cloud Tasks 作为队列驱动程序使用。

工作原理

使用 Cloud Tasks 作为 Laravel 队列驱动程序与 Redis 等其他 Laravel 队列驱动程序在本质上有所不同。

通常,Laravel 队列有一个监听传入作业的工作进程,使用 queue:work / queue:listen 命令。使用 Cloud Tasks 的情况则不同。相反,Cloud Tasks 将为您安排作业,并通过 HTTP 请求将作业负载发送到您的应用程序。不需要运行 queue:workqueue:listen 命令。

有关如何配置 Cloud Tasks 队列的更多信息,请参阅下一节 配置队列

此包使用 HTTP 请求处理程序,不支持 AppEngine。但请随时贡献!

要求

此包需要 Laravel 5.6 或更高版本。

请查看下表以了解支持的 Laravel 和 PHP 版本

Laravel 版本 PHP 版本
5.6 7.2 或 7.3 或 7.4
5.7 7.2 或 7.3 或 7.4
5.8 7.2 或 7.3 或 7.4
6.x 7.2 或 7.3 或 7.4 或 8.0
7.x 7.2 或 7.3 或 7.4 或 8.0
8.x 7.3 或 7.4 或 8.0 或 8.1
9.x 8.0 或 8.1

安装

(1) 使用 Composer 安装包

composer require pruvo/laravel-google-cloud-tasks-queue

官方文档 - 创建 Cloud Tasks 队列

(2) 在 config/queue.php 中添加新的队列连接

'cloudtasks' => [
    'driver' => 'cloudtasks',
    'project' => env('CLOUD_TASKS_PROJECT', ''),
    'location' => env('CLOUD_TASKS_LOCATION', ''),
    'handler' => env('CLOUD_TASKS_HANDLER', ''),
    'queue' => env('CLOUD_TASKS_QUEUE', 'default'),
    'service_account_email' => env('CLOUD_TASKS_SERVICE_EMAIL', ''),
],

(3) 更新 QUEUE_CONNECTION 环境变量

QUEUE_CONNECTION=cloudtasks

(4) [仅限 Laravel ^8.0 及以上版本] 在 config/queue.php 中配置失败的任务使用 database-uuids 驱动程序

'failed' => [
    'database' => env('DB_CONNECTION', 'mysql'),
    'table' => 'failed_jobs',
    'driver' => 'database-uuids',
],

(5) 使用 gcloud 创建新的 Cloud Tasks 队列

gcloud tasks queues create [QUEUE_ID]

如果队列不存在,该包将自动为您创建。

现在包已安装,下一步是设置正确的环境变量。

请查看下表了解其含义及其值应为何。

环境变量 描述 示例
CLOUD_TASKS_PROJECT 您的队列所属的项目。 my-project
CLOUD_TASKS_LOCATION AppEngine 托管的区域 europe-west6
CLOUD_TASKS_HANDLER Cloud Tasks 将调用的 URL 以处理作业。这应该是添加了 handle-task 路径的您的 Laravel 应用程序 URL https://<your website>.com/handle-task
CLOUD_TASKS_QUEUE 作业将添加到的队列 emails
CLOUD_TASKS_SERVICE_EMAIL AppEngine 服务账户的电子邮件地址。重要,它应具有 Cloud Tasks Enqueuer 角色。这用于保护处理程序。 my-service-account@appspot.gserviceaccount.com

身份验证

GOOGLE_APPLICATION_CREDENTIALS 环境变量设置为凭据文件的路径。

更多信息:https://cloud.google.com/docs/authentication/production

服务账户角色

如果您不使用主服务账户(它具有所有能力),则必须添加以下角色才能使其工作

  1. App Engine Viewer
  2. Cloud Tasks Enqueuer
  3. Cloud Tasks Viewer
  4. Service Account User

配置队列

当您首次使用gcloud tasks queues create创建队列时,默认设置将类似于以下内容

rateLimits:
  maxBurstSize: 100
  maxConcurrentDispatches: 1000
  maxDispatchesPerSecond: 500.0
retryConfig:
  maxAttempts: 100
  maxBackoff: 3600s
  maxDoublings: 16
  minBackoff: 0.100s

可配置设置

设置 描述
maxBurstSize 最大爆发大小限制了当队列中有许多任务且速率很高时,队列中任务的处理速度。
maxConcurrentDispatches Cloud Tasks允许为此队列分发的最大并发任务数
maxDispatchesPerSecond 从该队列分发任务的最高速率。
maxAttempts 每个任务尝试的次数。Cloud Tasks将尝试任务max_attempts次(即如果第一次尝试失败,则会有max_attempts - 1次重试)。必须是 >= -1。
maxBackoff 任务失败后将在min_backoffmax_backoff之间调度任务进行重试
maxDoublings 重试之间的时间将增加max_doublings次。任务的重试间隔从min_backoff开始,然后增加max_doublings次,然后线性增加,最后在max_backoff间隔内重试,直到达到max_attempts次。例如,如果min_backoff是10s,max_backoff是300s,max_doublings是3,则任务首先将在10s后重试。重试间隔将增加三次,然后增加2^3 * 10s。最后,任务将在max_backoff间隔内重试,直到任务已尝试max_attempts次。因此,请求将在10s、20s、40s、80s、160s、240s、300s、300s、...等间隔重试。

Laravel推荐设置

为了模拟单个queue:work/queue:listen进程,只需将maxConcurrentDispatches设置为1

gcloud tasks queues update [QUEUE_ID] --max-concurrent-dispatches=1

有关配置队列的更多信息

https://cloud.google.com/tasks/docs/configuring-queues

安全

作业处理程序要求每个请求都包含一个OpenID令牌。在安装步骤中我们设置了服务帐户邮箱,并使用该服务帐户,Cloud Tasks将生成一个OpenID令牌,并将其与作业有效负载一起发送到处理程序。

此包将验证令牌是否由Google数字签名。只有Google Tasks才能调用您的处理程序。

有关OpenID Connect的更多信息

https://developers.google.com/identity/protocols/oauth2/openid-connect

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件

致谢

此项目是从stackkit/laravel-google-cloud-tasks-queue的标签v2.3.0分叉并修改的。