Пакетная обработка большого количества данных набора Laravel - PullRequest
0 голосов
/ 08 декабря 2018

В настоящее время у меня есть Cron в laravel, который принимает данные в чанке и вызывает API.

Поток ниже

1. Cron runs every 5 minutes
2. Takes 80 data in chunks
3. Loop it through and call an API for 80 times and takes the next 80 in the next cron cycle

Этот метод настолько медленный, что если в таблице 10000000 записей, его обработка займет столько раз.Ранее я использовал чанк 1000, который ломал мою систему, говоря исключение «Слишком много открытых файлов», для которого я уменьшил чанк с 1000 до 80.

Я знаю, что это очень плохой дизайн того, кем я являюсьделать.

Мне нужно перестроить текущую модель и построить что-то, что может обрабатывать параллельно.Atleast 500-1000 параллельной обработки данных.

Как мне это сделать в Laravel.Это вообще возможно через PHP или мне нужно посмотреть на опцию вроде nodejs?Пожалуйста, помогите мне, если возможно использовать очередь.Даже если я использую очередь, смогу ли я выполнять параллельную обработку через нее?

Обновление

Теперь я попытался использовать очереди Laravel

Командаработает в фоновом режиме

php /Users/ajeesh/PhpstormProjects/untitled3/open-backend-v2/artisan queue:work database --tries=1 --timeout=56

Мои задания обрабатываются 3 раза.Я не могу понять, почему.

может кто-нибудь предложить решение для этого?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Пара ключевых вопросов, на которые вы должны ответить, прежде чем мы сможем найти лучшее решение:

  1. Являются ли эти вызовы API независимыми?Если вызовы зависят друг от друга, параллельная обработка невозможна.Пример: скажем, вы просматриваете страницы, а вызов API предоставляет URL-адрес следующей страницы в предыдущем вызове, тогда они являются зависимыми вызовами, и, если там нет шаблона, вы не можете использовать параллельную обработку.

  2. Почему задание вызывает API столько раз?Есть ли альтернатива (например, API массовых действий)?

  3. Вы упомянули в своем вопросе о таблице.Вы просматриваете таблицу и для каждой записи выполняете вызов API?

Ваши задания, вероятно, вызывают три раза, потому что они терпят неудачу из-за тайм-аутов, и вы установили числопробует до 3. Если у вас есть failed_jobs таблица настройки, проверьте ее, чтобы увидеть ошибку (я предполагаю тайм-аут).

Есть несколько решений этих проблем.Очереди, рабочие процесса, комбинация и т. Д. Являются возможными решениями, но к каждому нужно относиться с осторожностью.Лучший способ - минимизировать вызовы API (если это возможно).Обновит ответ, как только вы ответите.

0 голосов
/ 11 декабря 2018

Для запуска параллельных заданий вам потребуется установить менеджера, такого как «Супервизор», который предоставит вам различных работников (экземпляров).Вы можете установить столько рабочих, сколько могут обрабатывать ресурсы вашего сервера.

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

Супервизор

Затем вам нужно будет указать способ для каждой отправляемой работы, чтобы она требовала правильного доступного чанка.

Задание 1 получит чанк от 1 до 80. Задание 2 получит чанк от 81 до 160. ...

Вы не детализировали свой код, возможно, это не будет проблемой, но если это так, вы можете создать таблицу базы данных для отслеживания доступных чанков и еще не обработанных чанков.

Относительно вашей работы3 раза, код ниже:

php /Users/ajeesh/PhpstormProjects/untitled3/open-backend-v2/artisan queue:work database --tries=1 --timeout=56

Его функция - отправлять задания, уже находящиеся в очереди.Может быть, еще один фрагмент кода ставит очередь в очередь 3 раза?

Вам не нужно будет вручную отправлять задания после установки «Супервизора».Он будет отслеживать ваши рабочие места и отправлять их, как только они появятся (если вы настроили их таким образом).

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