pruvo / laravel-google-cloud-tasks-queue
使用 Google Cloud Tasks 和 Google Cloud Run 的 Laravel 服务器端无服务器队列。
此包的官方仓库似乎已消失,因此该包已被冻结。
Requires
- ext-json: *
- firebase/php-jwt: ^5.5
- google/cloud-tasks: ^v1.9
- phpseclib/phpseclib: ~2.0
Requires (Dev)
- mockery/mockery: ^1.2
- orchestra/testbench: ^3.5 || ^3.6 || ^3.7 || ^3.8 || ^4.0 || ^5.0
README
介绍
此包允许您将 Google Cloud Tasks 作为队列驱动程序使用。
工作原理
使用 Cloud Tasks 作为 Laravel 队列驱动程序与 Redis 等其他 Laravel 队列驱动程序在本质上有所不同。
通常,Laravel 队列有一个监听传入作业的工作进程,使用 queue:work
/ queue:listen
命令。使用 Cloud Tasks 的情况则不同。相反,Cloud Tasks 将为您安排作业,并通过 HTTP 请求将作业负载发送到您的应用程序。不需要运行 queue:work
或 queue: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
(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
服务账户角色
如果您不使用主服务账户(它具有所有能力),则必须添加以下角色才能使其工作
- App Engine Viewer
- Cloud Tasks Enqueuer
- Cloud Tasks Viewer
- 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_backoff 和max_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分叉并修改的。