Как обновить большую базу данных в базе данных mysql с помощью cronJobs

#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. Я думаю, что ваша процедура сработает, мне кажется, все в порядке