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

Гарантия доставки

Гарантия доставки — формальное обещание шины о том, как именно она доставляет сообщения. Это контракт между DataHUB и её клиентами: чего можно ожидать от платформы, а на что приходится закладываться самим клиентам.

DataHUB реализует модель at-least-once — «хотя бы один раз».

Что значит at-least-once

Сообщение, принятое шиной, гарантированно дойдёт до каждого своего получателя — минимум один раз, но потенциально больше. То есть приёмнику один и тот же идентификатор сообщения может прийти повторно.

Почему так:

  1. Приёмник подтверждает приём шине (ACK) после фиксации сообщения в своём локальном пуле (см. Жизненный цикл сообщения).
  2. Если приёмник упал или сеть оборвалась между записью в пул и отправкой ACK — шина не узнает, что приём состоялся, и через таймаут выдаст сообщение снова.
  3. Приёмник увидит то же сообщение с тем же идентификатором второй раз.

Распознавание дубликата — задача приёмника. Шина её решить не может: только сам приёмник знает, что сообщение с этим идентификатором у него уже есть. Это требование — Идемпотентность.

Что at-least-once гарантирует

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

Что at-least-once НЕ гарантирует

  • Однократность доставки. Сообщение может прийти несколько раз — это и есть смысл «at-least-once».
  • Глобальный порядок между разными очередями. Сообщения, попадающие в разные очереди, не сравнимы по порядку.
  • Время доставки. Шина обещает «доставим», но не «за N секунд». При нагрузке очередь может расти.
  • Валидность содержимого при транзите. Шина передаёт сообщение как есть — никаких проверок содержимого в пути нет. При этом DataHUB как экосистема гарантирует ссылочную целостность: перед отправкой проверяется, что идентификатор каждой сущности, на которую ссылается реквизит, уже известен в интеграционном контуре. Подробнее — в Идентификации объектов между системами и Параллелизме.

Почему не exactly-once

«Ровно один раз» в распределённой системе с независимыми падениями участников математически невозможно обеспечить без согласованного двухфазного коммита между шиной и БД каждого получателя — а это сделало бы обмен медленным, хрупким и сложным в эксплуатации.

Поэтому стандартный выбор для бизнес-обмена в промышленных интеграционных шинах — at-least-once плюс идемпотентность на стороне клиентов. DataHUB следует этому стандарту сознательно: проще в эксплуатации, предсказуемее под нагрузкой.

Что дальше