Laravel PHP асинхронный вызов функции - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть спокойный API (Laravel 5.4), который выполняет следующий сценарий

  1. Подтвердить некоторые входные данные
  2. Создайте несколько файлов PDF
  3. Собрать сгенерированные файлы PDF в один архивный файл
  4. (В случае успеха) Отправьте клиенту электронное письмо с URL сгенерированного файла архива, чтобы загрузить его.
  5. Обратный ответ (JSON) с результатом проверки или результатами процесса

Проблема, конечно, в том, что с увеличением количества файлов время отклика также увеличивается ... поэтому мне нужно сделать следующее

  1. Проверка некоторых входных данных
  2. Обратный ответ (JSON) с результатом проверки и сообщением о том, что после создания архива вы получите уведомление по электронной почте

Тогда в другом потоке, если все входные данные были действительны, я хочу

  1. Создайте несколько файлов PDF
  2. Собрать созданные PDF-файлы в один архивный файл
  3. (В случае успеха) Отправьте клиенту электронное письмо с URL сгенерированного файла архива, чтобы загрузить его.
  4. (В случае ошибки) Отправьте электронное письмо клиенту с проблемой.

Я читал о многих методах Laravel Queues, пакете Spatie \ Async и т. Д., Но я считаю, что мой случай намного проще, чем все это, и я не хочу добавлять бесполезные накладные расходы на свой проект. не могли бы вы привести меня к наилучшему оптимизированному способу решения / реализации вышеуказанного сценария.

1 Ответ

0 голосов
/ 11 апреля 2019

поэтому не могли бы вы привести меня к наилучшему оптимизированному способу решения / реализации вышеуказанного сценария.

Я думаю, что вы уже наметили наиболее оптимизированный способ его решения с учетом вашей проблемы.,Если ваше ограничение состоит в том, чтобы минимизировать задержку HTTP-запроса, то работа должна быть выгружена:

enter image description here

Чтобы смоделировать это, какая-то очередьобычно используется:

Таким образом, HTTP публикует запрос архива и немедленно возвращает его клиенту, а затем асинхронно читает архиватор из очереди:

enter image description here


Использование очереди имеет много преимуществ:

  • Отсоединяет HTTP от архиватора
  • Открывает понтон для долговечности
  • Поддерживает обратнодавление
  • Поддержка горизонтального масштабирования вне архиваторов
  • Поддержка архиваторов на другом оборудовании, отличном от HTTP

Я думаю, что реализация очереди в значительной степени зависит от вашегонефункциональные требования:

  • Должны ли запросы архива быть надежными?
  • Вам нужна балансировка нагрузки?архивных заданий?

Даже если вам нужно пройти с очередями Laravel, есть несколько вопросов относительно долговечности, на которые нужно ответить.Т.е. если бы вы использовали Redis и Larevel Queue, как вы справляетесь с долговечностью?Можно ли потерять запрос архива?Вам нужно fsync при каждой записи в redis (постоянство AOF?) Можно ли терять записи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...