Почему пакет laravel-stripe-webhooks рекомендует помещать классы заданий в очередь?

Из документации пакета spatie/laravel-stripe-webhooks :

Мы настоятельно рекомендуем вам поставить это задание в очередь, поскольку это сведет к минимуму время ответа на запросы веб-перехватчика. Это позволяет обрабатывать больше запросов веб-перехватчика полосы и избегать таймаутов.

И вот пример, который они приводят:

class HandleChargeableSource implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

    /** @var \Spatie\WebhookClient\Models\WebhookCall */
    public $webhookCall;

    public function __construct(WebhookCall $webhookCall)
    {
        $this->webhookCall = $webhookCall;
    }

    public function handle()
    {
        // do your work here

        // you can access the payload of the webhook call with `$this->webhookCall->payload`
    }
}

Насколько я понимаю, этот пакет работает следующим образом:

  1. Событие веб-перехватчика отправляется Stripe на настроенную мной конечную точку, которая вызывает метод \Spatie\StripeWebhooks\StripeWebhooksController__invoke.
  2. Пакет отправляет задание.
  3. Тогда то, что задание ставится в очередь, означает, что оно будет помещено в очередь еще раз.

Я был бы очень признателен за объяснение, почему я должен поставить саму работу в очередь. Насколько я знаю, одного контроллера, отправляющего задание, должно быть достаточно для minimize the response time of the webhook requests.

Я что-то упускаю? Не используется ли очередь дважды для одного и того же события веб-перехватчика?

Заранее благодарю вас за ответы.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
0
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлено: действительно нет необходимости ставить задания в очередь, поскольку входящие запросы веб-перехватчика уже поставлены в очередь. Файл readme этого пакета устарел. В 2021 году они добавили пакет под названием spatie/laravel-webhook-client, который отвечает за постановку в очередь входящих веб-перехватчиков. В то время они не обновляли readme.


Ваше понимание работы пакета в основном правильное. Когда вызывается конечная точка веб-перехватчика, она отправляет ProcessWebhookJob в свою собственную очередь. Это задание, в свою очередь, проверит, какие события произошли, и отправит задания, которые вы зарегистрировали для этих событий.

Если вы не определите свои собственные задания как помещаемые в очередь, они будут обрабатываться в том же процессе, что и задание ProcessWebhook. Это может привести к задержкам обработки и даже тайм-аутам, если выполнение заданий занимает больше времени или необходимо обработать много событий.

Таким образом, имеет смысл определить ваши собственные задания как помещаемые в очередь, чтобы помещать их в очередь при отправке. Это освободит задание ProcessWebhook только для отправки заданий, а не для обработки.

Я попытался сделать задание не ставящимся в очередь. Он по-прежнему отправляет в sqs. Это имеет смысл, поскольку если вы проверите код class ProcessStripeWebhookJob, вы увидите, что он отправляется в очередь, даже если вы делаете задание, которое вы пишете, не помещаемым в очередь.

Zakaria 22.04.2024 12:02

Он отправляет в очередь задание ProcessStripeWebhook (настроенное с помощью «stripe-webhooks.queue»), а не обязательно ваши собственные задания. Когда задание веб-перехватчика обрабатывается, оно проверяет, какие задания необходимо запланировать, исходя из того, какие задания вы зарегистрировали для событий. Если вы не укажете свои собственные задания для постановки в очередь, они будут обрабатываться в том же процессе, что и задание WebhookJob. Таким образом, если событий много, это может привести к задержкам обработки и тайм-аутам, поэтому имеет смысл поместить ваши собственные задания в отдельную очередь, чтобы задание веб-перехватчика отвечало только за отправку заданий.

Henridv 22.04.2024 12:26

@Закария, я соответствующим образом обновил свой ответ.

Henridv 22.04.2024 12:35

Все еще не понимаю @Henridv. Если все, что делает контроллер, — это помещает задание в очередь и возвращает ответ HTTP 200 в Stripe, где будет узкое место? Это работник, который выполняет всю работу в автономном режиме. В любом случае никакая обработка запроса не будет выполняться, вне зависимости от того, ставите ли вы задание в очередь или нет.

Zakaria 22.04.2024 20:23

@Закария, я думаю, ты совершенно прав. Я глубоко углубился в код и увидел, что файл readme не обновился, когда они добавили пакет spatie/laravel-webhook-client. Этот пакет отвечает за постановку в очередь запросов веб-перехватчика. До этого входящие вебхуки обрабатывались немедленно, поэтому имело смысл ставить задания в очередь.

Henridv 23.04.2024 11:24

звучит как объяснение, которое имеет смысл. Спасибо, что нашли время разобраться в этом!

Zakaria 25.04.2024 17:25

Другие вопросы по теме