#php #laravel
Вопрос:
У меня есть Product
модель с id,name,price
.
price
Значение хранится во внешнем API, и мне нужно извлекать его каждую минуту, чтобы обновлять его в базе данных.
Просматривая документацию Laravel, я нашел два способа реализации:
- Создайте команду ремесленника (https://laravel.com/docs/8.x/artisan) и добавьте его в расписание задач (https://laravel.com/docs/8.x/scheduling#scheduling-artisan-commands)
- Создайте работу (https://laravel.com/docs/8.x/queues) и добавьте его в расписание задач (https://laravel.com/docs/8.x/scheduling#scheduling-artisan-commands)
Прежде всего, есть ли какой-либо другой подход, который я должен принять во внимание?
Если нет, то какой из вышеперечисленных подходов был бы лучшим и почему он подходит для моего варианта использования?
Ответ №1:
Согласно моим комментариям к одному из ваших предыдущих вопросов по этой теме, используете ли вы очередь или нет, зависит от вашего варианта использования.
Команда ремесленника-это процесс, который выполняется один раз и выполняет задачу или задачи, а затем завершается, когда эта задача завершена. Как правило, он запускается из командной строки, а не с помощью действия пользователя. Затем вы можете использовать планирование задач операционной системы хоста вашей команды (например, задание CRON) для периодического выполнения этой команды. Он будет добросовестно выполнять его, когда вы запланируете его выполнение.
Задание, поставленное в очередь, будет выполнено, когда Задание появится следующим в очереди в порядке приоритета. Допустим, вы отправляете вызов API (из другого поста) в очередь на обработку. Затем другая система решает, что ей необходимо срочно отправлять электронные письма (с более высоким приоритетом). Внезапно ваша работа, которая была следующей, теперь ожидает завершения 2000 других заданий (что может занять полчаса). Затем вы больше не будете получать новые данные до тех пор, пока ваша работа не будет выполнена.
С запланированным заданием у вас есть система, критичная по времени. С очередями у вас есть подход «когда я дойду до этого».
Надеюсь, это прояснит разницу.
Ответ №2:
С laravel очень просто использовать встроенный планировщик. Вам нужно добавить только одну запись на кронтаб, а именно запускать команду php artisan schedule:run
КАЖДУЮ МИНУТУ в вашем проекте. После этого вам не нужно беспокоиться о настройке crontab на сервере, вы просто добавляете команды в планировщик laravel, и они будут работать так, как ожидалось.
Комментарии:
1. Я смог обновить цену с помощью бот-подходов artisan и задания в очереди, почему вы считаете, что artisan лучше всего подходит для моего варианта использования?
2. @aletede91 потому что cronjobs надежны, и после настройки вашего единственного cron для laravel вам больше не нужно беспокоиться о запланированных задачах, так как laravel позаботится о каждой задаче и выполнит ее вовремя.
Ответ №3:
Вероятно, вам следует использовать планирование заданий Cron, которое было бы первым подходом, о котором вы упомянули.
Обычно для этого типа вариантов использования команды являются самым простым и чистым подходом.
Есть несколько вещей, которые нужно сделать, чтобы все работало так, как ожидалось:
- Создайте новую команду, которая должна будет позаботиться о попадании в конечную точку и сохранении полученных данных в базе данных
- В
Kernel.php
файле зарегистрируйте свою команду и частоту выполнения (каждую минуту) - Бежать
php artisan schedule:run
Вы можете прочитать больше о том, как его создать, здесь:
Комментарии:
1. Спасибо за объяснение, это определенно помогает! В любом случае, я все еще немного смущен тем, почему использую одно вместо другого.