Перейти к содержанию

Алгоритм приёма и подтверждения

Приём входящих сообщений разделён на две фазы: получение и подтверждение доставки (быстро, транзакционно) и обработка сообщения (асинхронно). Такое разделение обязательно для гарантированной доставки.

Фаза 1: получение и ACK

  1. Проверить условие продолжения: действующий Refresh-токен, отсутствие сигнала остановки.
  2. Выполнить запрос к серверу DataHUB. В зависимости от возможностей среды адаптер использует long-polling (сервер удерживает соединение до появления сообщения; при истечении таймаута отвечает 408) или short-polling (запрос, немедленный ответ 204 если очередь пуста).
  3. Отправить запрос с заголовком Authorization: Bearer {accessToken}.
  4. Обработать ответ сервера:

    Код Действие
    200 OK Сообщение получено. Извлечь тело и идентификатор доставки из заголовка. Перейти к шагу 5.
    204 No Content Сообщений нет. Вернуться к шагу 1.
    408 Request Timeout Long-polling завершился без сообщений. Вернуться к шагу 1.
    401 Unauthorized Access-токен истёк. Обновить через Refresh-токен и вернуться к шагу 1.
    Ошибка связи Нет ответа от сервера. Зафиксировать в логе, прервать цикл.
  5. Начать транзакцию.

  6. Разобрать тело сообщения и поместить его в локальную очередь входящих.
  7. Зафиксировать транзакцию.
  8. Отправить подтверждение получения (ACK) через Transport API с идентификатором доставки.
  9. Обработать ответ на ACK:

    Код Действие
    200 OK Подтверждение принято. Вернуться к шагу 1.
    Любая ошибка Зафиксировать в логе, прервать цикл.

Шаги 5–7 выполняются атомарно: сообщение либо записано в локальную очередь, либо транзакция откатывается и сообщение остаётся в шине для повторной доставки.

Идемпотентность обязательна

Если адаптер завершится с ошибкой после фиксации транзакции (шаг 7), но до успешной отправки ACK (шаг 8), сервер повторно доставит то же сообщение при следующем опросе. Оно снова попадёт в локальную очередь. Входящие обработчики обязаны быть идемпотентными — повторная обработка одного сообщения не должна изменять состояние системы.

Фаза 2: обработка из локальной очереди

После фиксации транзакции сообщение находится в локальной очереди со статусом «Ожидание обработки». Фоновый процесс:

  1. Выбирает сообщения, готовые к обработке (задержка истекла, статус позволяет).
  2. Вызывает входящий обработчик — тот получает десериализованное тело и выполняет прикладную логику.
  3. При успехе: переводит сообщение в финальный статус.
  4. При ошибке: откладывает на заданную задержку и увеличивает счётчик попыток.

Подробнее о повторных попытках — в Обработка ошибок.