【问题标题】: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】:

    应该像这样工作

    1. 创建辅助函数以检测第 3 方 api 是否启动或关闭

    2. 创建一个类或辅助函数来处理 3rd 方 API 请求,如果对 3rd 方 API 的请求失败则抛出错误(你可能想调用#1)

    3. 创建一个没有重试的工作(只能运行一次)并调用#2handle

    4. 将你的工作推送到不同的queue e.i. WhatEverJob::dispatch()->onQueue('apirequest');。您还应该在主管工作人员 e.i 中处理此队列

      php artisan queue:work --queue=default,apirequest

    5. 创建一个每小时、每分钟或其他时间运行的任务计划程序 (cron)。这应该首先运行#1(或者先查询failed_jobs,无论你喜欢什么)如果它向下,则退出,如果它向上,然后继续查询failed_jobs表,只提取列queueapirequest的数据。您可以使用 payload->displayName 进行额外的过滤,这应该是您的工作类别,您还可以检查 payload->maxTries 并在尝试次数超过时执行某些操作。然后手动重试每个失败的条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 2018-06-20
      • 1970-01-01
      相关资源
      最近更新 更多