Я только начинаю с очередями, и они отлично работают для обмена сообщениями и отправки электронной почты и SMS-сообщений в Twilio и т. Д.
Но сейчас я хочу сделать что-то более сложное и трудоемкое. Я пытаюсь загрузить файл из примерно 10000 строк в AmazonS3, проанализировать его, проверить на наличие дубликатов, а затем вставить только те записи, которые не являются дубликатами.
Когда я запускаю этот процесс, это занимает более 6 минут. Который способ долго. Я хочу, чтобы этот запуск выполнялся в фоновом режиме, с визуальным индикатором выполнения, который обновляется время от времени в зависимости от состояния очереди.
Кроме того, во время работы я хочу, чтобы пользователи имели полный доступ к таблицам сайта и базы данных. Этот процесс заблокирует мою основную таблицу.
Поэтому я хочу, чтобы он работал в фоновом режиме, только один раз прикоснитесь к основной таблице, чтобы проверить наличие дубликатов, а оттуда просто обработайте / проанализируйте файл во временной таблице, содержащей более 10000 строк. Оставляя другой стол свободным.
После завершения … запись в основную таблицу будет выполнена только один раз.
Как я могу добиться этого, не замедляя работу сайта / основного сервера ?? Я прошу прощения за чрезвычайно широкий вопрос
Laravel Queues можете делать то, что вы хотите, но есть несколько моментов, на которые следует обратить внимание в вашей электронной почте.
Как я могу добиться этого, не замедляя работу сайта / основного сервера?
Ну, очередь запускается как отдельный процесс на сервере, так что вы наверное не увидит значительного влияния на сервер, если ваш фоновый процесс не сделает ничего слишком напряженного для сервера. Если вы беспокоитесь о влиянии на производительность и используете сервер Linux, существуют варианты ограничения ресурсов, используемых процессами — ознакомьтесь с renice
Команда, которая позволяет настроить приоритет процессов. Если вы не используете Linux, то, возможно, есть другие варианты для вашей ОС.
Что касается базы данных, на нее сложнее ответить, не зная, как выглядят ваши таблицы. Может быть возможно выполнить проверку на наличие дубликатов с помощью одного запроса и JOIN
на двух таблицах, возможно, записав результаты проверки в другую таблицу. это может быть работать, но это также может занять много времени в зависимости от того, как настроены таблицы. Другим решением будет использование зеркала основной таблицы базы данных — временно скопируйте его, сделайте свою работу, а затем удалите. И, наконец, для действительно участвует решение, настройте репликацию базы данных и работайте с подчиненным.
Что касается запуска работника очереди, я обнаружил, что с помощью supervisord
Работа в фоновом режиме ОЧЕНЬ полезна — она позволяет мне легко запускать / останавливать процесс и автоматически перезапускает процесс в случае его сбоя. документация по слушателям очереди есть некоторое обсуждение этого.
И рабочий потерпит неудачу — я обнаружил, что мой рабочий процесс часто выходит из строя. Я думаю, что это как-то связано с настройками PHP CLI, но это не вызвало у меня никаких проблем, поэтому я больше не исследовал это. Однако для длительной работы вы можете столкнуться с трудностями. Один из способов смягчить это состоит в том, чтобы разбить вашу работу на несколько небольших работ и объединить их в гирляндную цепочку: когда часть 1 заканчивается, она ставит в очередь часть 2; когда part2 заканчивается, он ставит в очередь part3 и т. д.
Что касается индикатора выполнения, это довольно просто. Попросите задания обновить значение (возможно, в вашей базе данных или, возможно, в файловой системе) с текущим состоянием и иметь функцию Javascript на клиенте, периодически выполняющую AJAX-запрос для получения этого значения. & обновить индикатор выполнения.
Других решений пока нет …