Модуль для управления очередью запросов к внешним сервисам.
Необходим, когда сервер внешнего ресурса не может принять количество запросов, генерируемых сайтом.
В моем случа 10 rps - это уже был предел
- Скачайте архив с репозиторием.
- Скопируйте папку
razout.bxrequestqueue
из архива репозитория в папкуlocal/modules
вашего проекта. - Установите модуль в административном разделе 1С-Битрикс "Управление сайтом".
Общий алгоритм такой:
- Генерируем запрос;
- Добавляем его в очередь, получаем ID записи;
- При получении ответа, записываем его и меняем статус записи;
- Проверяем, если ответ уже лежит в базе, то забираем и подчищаем за собой.
Выглядит это примерно следующим образом:
//формируем опции для запроса
$query = json_encode($options);
//Добавляем запрос в очередь
$queue = new CQueue();
$queue->Add($query, $request_name, $callback, $callback_params);
Дальше любым удобным для Вас образом реализуем функция вытаскивания из очереди, запроса и запись ответа. К примеру у меня были две функции. выполняемые на хитах и агент на кроне.
public static function CronCheckQueue()
{
$queue = new CQueue();
$time_start = time();
do {
//хватаем верхний
$item = $queue->ShiftQueue();
//если можем выполнять, то приступаем
if ($queue->CheckQueue() && $item) {
//предварительно меняем статус
$queue->ChangeQueue(true, $item['ID']);
//выполняем сам запрос
$result = ...;
//записываем результат
$queue->QueueItemUpdate($item['ID'], $result);
//меняем статус
$queue->ChangeQueue(false, $item['ID']);
sleep(1);
}
} while ((time() - $time_start) < 30);
return "CPayment::CronCheckQueue();";
}