1000+ вызовов API с 1 cron-заданием?

мы имеем следующую потенциальную ситуацию:

Веб-приложение, которое может иметь 1000+ пользователей.

Мы хотим настроить cronjob для извлечения данных через API внешнего сервиса для ВСЕХ 1000 пользователей с одним вызовом cronjob (ПРИМЕЧАНИЕ: каждый пользователь имеет свои собственные учетные данные API с этой внешней службой API)!

Что было бы разумным способом сделать это?

Информация:

  • Один вызов API с учетными данными может занять до 5 (!) Секунд, чтобы вернуть данные.

Возможный сценарий:

Cronjob вызывает локальный php-скрипт (cronjobcall.php), который проходит через всех 1000 пользователей. Для каждого пользователя этот скрипт вызывает другой локальный скрипт через curl (localfile_calls_api.php), который делает фактический вызов API и сохраняет возвращенные данные в базу данных MySQL.

cronjobcall.php

foreach($ThousandsOfUsers as $UserId => $UserCredentials) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "localfile_calls_api.php?UserId=$UserId&UserCredentials=$UserCredentials"); curl_setopt($ch, CURLOPT_HEADER, 0); $result=curl_exec($ch); } 

localfile_calls_api.php

 // !!! this could take up to 5(!) seconds to return result $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://external_api_url.php?UserId=$UserId&UserCredentials=$UserCredentials"); curl_setopt($ch, CURLOPT_HEADER, 0); $result=curl_exec($ch); if($result) { save_to_MySql($result,$UserId); } 

Поэтому я думаю о том, чтобы разделить всю процедуру на два разных php-файла, потому что сам вызов API может занять до 5 секунд для возврата данных.

Правильно ли это?

Есть ли лучший способ сделать это?

Большое спасибо!

Related of "1000+ вызовов API с 1 cron-заданием?"

Если вам действительно нужно периодически вызывать этот вызов API для каждого пользователя, я бы установил его по-другому:

  • Добавьте два столбца в таблицу: lastUpdated и isBeingProcessed (или что-то подобное);
  • Создайте скрипт, который запускает каждые X (1?) Минуты с помощью cron;
  • В своем скрипте получите записи XX (10?) С самой старой lastUpdated датой и не обрабатываемыми и установите флаг isBeingProcessed ;
  • По завершении каждого вызова API обновите информацию пользователя, включая lastUpdated дату или время, isBeingProcessed флаг isBeingProcessed ;

В зависимости от того, что может обрабатывать ваш сервер и что позволяет API, вы можете даже настроить его на одновременное / одновременное выполнение нескольких заданий, что сокращает общее время для обновления.