Алгоритм приёма и подтверждения
Приём входящих сообщений разделён на две фазы: получение и подтверждение доставки (быстро, транзакционно) и обработка сообщения (асинхронно). Такое разделение обязательно для гарантированной доставки.
Фаза 1: получение и ACK
- Проверить условие продолжения: действующий Refresh-токен, отсутствие сигнала остановки.
- Выполнить запрос к серверу DataHUB. В зависимости от возможностей среды адаптер использует long-polling (сервер удерживает соединение до появления сообщения; при истечении таймаута отвечает
408) или short-polling (запрос, немедленный ответ204если очередь пуста). - Отправить запрос с заголовком
Authorization: Bearer {accessToken}. -
Обработать ответ сервера:
Код Действие 200 OKСообщение получено. Извлечь тело и идентификатор доставки из заголовка. Перейти к шагу 5. 204 No ContentСообщений нет. Вернуться к шагу 1. 408 Request TimeoutLong-polling завершился без сообщений. Вернуться к шагу 1. 401 UnauthorizedAccess-токен истёк. Обновить через Refresh-токен и вернуться к шагу 1. Ошибка связи Нет ответа от сервера. Зафиксировать в логе, прервать цикл. -
Начать транзакцию.
- Разобрать тело сообщения и поместить его в локальную очередь входящих.
- Зафиксировать транзакцию.
- Отправить подтверждение получения (
ACK) через Transport API с идентификатором доставки. -
Обработать ответ на ACK:
Код Действие 200 OKПодтверждение принято. Вернуться к шагу 1. Любая ошибка Зафиксировать в логе, прервать цикл.
Шаги 5–7 выполняются атомарно: сообщение либо записано в локальную очередь, либо транзакция откатывается и сообщение остаётся в шине для повторной доставки.
Идемпотентность обязательна
Если адаптер завершится с ошибкой после фиксации транзакции (шаг 7), но до успешной отправки ACK (шаг 8), сервер повторно доставит то же сообщение при следующем опросе. Оно снова попадёт в локальную очередь. Входящие обработчики обязаны быть идемпотентными — повторная обработка одного сообщения не должна изменять состояние системы.
Фаза 2: обработка из локальной очереди
После фиксации транзакции сообщение находится в локальной очереди со статусом «Ожидание обработки». Фоновый процесс:
- Выбирает сообщения, готовые к обработке (задержка истекла, статус позволяет).
- Вызывает входящий обработчик — тот получает десериализованное тело и выполняет прикладную логику.
- При успехе: переводит сообщение в финальный статус.
- При ошибке: откладывает на заданную задержку и увеличивает счётчик попыток.
Подробнее о повторных попытках — в Обработка ошибок.