#mysql #laravel #api #cron #guzzle
#mysql #laravel #API #cron #жрать
Вопрос:
Я очень благодарен, если кто-нибудь поможет мне решить эту проблему.
Подробно: у меня есть таблица mysql, в которой хранится более 110000 записей с уникальным номером приложения (столбца). Теперь есть Detail API, который будет принимать только 1 номер приложения одновременно в параметре URI и возвращать сведения об этом номере приложения. на данный момент для ответа потребуется около 1 минуты.
Теперь мне нужно обновить эти записи (несколько столбцов), используя планирование заданий Cron, чтобы всегда обновлять запись в базе данных. и он будет постепенно обновляться.
Поток: Получить номер приложения из базы данных -> Call detail API -> обновить там запись в базе данных.
Проблема: в базе данных большое количество записей, поэтому мы не можем вызвать API для всех номеров приложений в единицах.
Я использую Laravel 7 и использую HTTP-клиент 7.2 HTTP Client для вызова API.
Любые предложения приветствуются!
(Проверено) Обновление: я подумываю сделать что-то подобное и согласен с комментарием @bhucho вызывать cron каждые 15 минут
Мы создаем еще один столбец в таблице для last_updated_id по умолчанию 1, и мы напишем запрос для получения номера приложения что-то вроде и получим 100 или 500 записей в одном слэбе, используя методы Laravel take отсюда Запросы к базе данных
$latestIdInColumn = myTableClassRef::max(last_updated_id);
$applications = myTableClassRef::select('application_number)->where('id', '>', $latestIdInColumn)
->take(100)
->get()->toArray();
Здесь мы вызываем detail API и обновляем для каждого номера приложения, когда будет выполнено последнее обновление приложения, мы сохраним этот идентификатор в last_updated_id.
При повторном вызове cron у нас есть этот last_updated_id, поэтому мы применим тот же фильтр в следующем запросе, где id ‘>’ $ latestIdInColumn . теперь мы получим следующие 100/500 записей, где id больше, чем $ latestIdInColumn.
if ( $applications )
{
For all other available id
} else {
when record not found.
Here we will reset the last_updated_id = 1
}
Теперь функция будет извлекаться из идентификатора 1.
- Он еще не протестирован, я просто планирую это сделать, я рад получить отзывы по этому поводу.
Примечание: Теперь API не отвечает 1 минуту, я решил эту проблему.
Обновление 2: оно работает хорошо.
Комментарии:
1. похоже на планирование задач laravel.com/docs/8.x/scheduling
2. Получение 1 записи не должно занять минуту — у вас есть соответствующие индексы? и 110000 записей невелики.
3. @AnuratChapanond Да, но я спрашиваю, как это возможно, нам нужно вызывать API для каждого номера приложения и обновлять детали в базе данных.
4. @P.Salmon Хорошо, я проверю время, но мне нужно вызвать API для каждого номера приложения и обновить там запись в базе данных.
5. Я думаю, что ваша процедура сработает, мне кажется, все в порядке