Гарантия доставки
Гарантия доставки — формальное обещание шины о том, как именно она доставляет сообщения. Это контракт между DataHUB и её клиентами: чего можно ожидать от платформы, а на что приходится закладываться самим клиентам.
DataHUB реализует модель at-least-once — «хотя бы один раз».
Что значит at-least-once
Сообщение, принятое шиной, гарантированно дойдёт до каждого своего получателя — минимум один раз, но потенциально больше. То есть приёмнику один и тот же идентификатор сообщения может прийти повторно.
Почему так:
- Приёмник подтверждает приём шине (ACK) после фиксации сообщения в своём локальном пуле (см. Жизненный цикл сообщения).
- Если приёмник упал или сеть оборвалась между записью в пул и отправкой ACK — шина не узнает, что приём состоялся, и через таймаут выдаст сообщение снова.
- Приёмник увидит то же сообщение с тем же идентификатором второй раз.
Распознавание дубликата — задача приёмника. Шина её решить не может: только сам приёмник знает, что сообщение с этим идентификатором у него уже есть. Это требование — Идемпотентность.
Что at-least-once гарантирует
- Сообщение не теряется. Если шина приняла сообщение, оно дойдёт до каждого получателя — рано или поздно, даже после сбоев инфраструктуры.
- Сообщение переживает перезагрузку шины и временную недоступность получателя. Очереди персистентны на диске, сообщение лежит до подтверждения.
- Упорядоченность внутри одной очереди. Сообщения в очереди одного получателя выдаются в порядке постановки (если он обрабатывает однопоточно).
Что at-least-once НЕ гарантирует
- Однократность доставки. Сообщение может прийти несколько раз — это и есть смысл «at-least-once».
- Глобальный порядок между разными очередями. Сообщения, попадающие в разные очереди, не сравнимы по порядку.
- Время доставки. Шина обещает «доставим», но не «за N секунд». При нагрузке очередь может расти.
- Валидность содержимого при транзите. Шина передаёт сообщение как есть — никаких проверок содержимого в пути нет. При этом DataHUB как экосистема гарантирует ссылочную целостность: перед отправкой проверяется, что идентификатор каждой сущности, на которую ссылается реквизит, уже известен в интеграционном контуре. Подробнее — в Идентификации объектов между системами и Параллелизме.
Почему не exactly-once
«Ровно один раз» в распределённой системе с независимыми падениями участников математически невозможно обеспечить без согласованного двухфазного коммита между шиной и БД каждого получателя — а это сделало бы обмен медленным, хрупким и сложным в эксплуатации.
Поэтому стандартный выбор для бизнес-обмена в промышленных интеграционных шинах — at-least-once плюс идемпотентность на стороне клиентов. DataHUB следует этому стандарту сознательно: проще в эксплуатации, предсказуемее под нагрузкой.
Что дальше
- Идемпотентность — обязательное дополнение at-least-once на стороне клиента.
- Жизненный цикл сообщения — в каких шагах живут гарантии.
- Очереди сообщений — где физически живёт сообщение до подтверждения.