【问题标题】:Laravel holt a queued jobLaravel 持有一个排队的工作
【发布时间】:2023-02-02 18:11:37
【问题描述】:
我们正在使用 laravel 创建一个应用程序,例如 example.com。在我们的应用程序中,有一个 post api“example.com/api/order-place”。在此 api 中,我们将一些数据存储在我们的数据库中,并向我们的客户发送成功的响应。我们还调用第三方应用程序以根据同一请求获取其他一些数据 (third-party.com/api/get-data)。我们正在使用队列作业来获取此数据,而不会妨碍主要的下订单请求旅程。
但是有时候第三方api服务宕机了。那时,我们希望将第三方 api 调用存储在某个地方(队列),当第三方应用程序服务启动时,我们希望处理所有排队的作业。
我们怎样才能做到这一点?是否可以使用 laravel 队列解决此问题?就像当第三方应用程序关闭时,我们保留我们的队列,当第三方应用程序启动时,我们处理这些作业。
我们可以对失败的作业使用队列重试来做到这一点。但不想这样。我们只想在第三方应用程序关闭时保持队列
【问题讨论】:
标签:
laravel
queue
jobs
laravel-9
【解决方案1】:
应该像这样工作
-
创建辅助函数以检测第 3 方 api 是否启动或关闭
-
创建一个类或辅助函数来处理 3rd 方 API 请求,如果对 3rd 方 API 的请求失败则抛出错误(你可能想调用#1)
-
创建一个没有重试的工作(只能运行一次)并调用#2在handle
-
将你的工作推送到不同的queue e.i. WhatEverJob::dispatch()->onQueue('apirequest');。您还应该在主管工作人员 e.i 中处理此队列
php artisan queue:work --queue=default,apirequest
-
创建一个每小时、每分钟或其他时间运行的任务计划程序 (cron)。这应该首先运行#1(或者先查询failed_jobs,无论你喜欢什么)如果它向下,则退出,如果它向上,然后继续查询failed_jobs表,只提取列queue值apirequest的数据。您可以使用 payload->displayName 进行额外的过滤,这应该是您的工作类别,您还可以检查 payload->maxTries 并在尝试次数超过时执行某些操作。然后手动重试每个失败的条目。