Найти в Дзене
Джавист Роман

Семантика доставки событий. Что это и зачем нужно знать?

Прежде чем грузить теорией, хочется описать почему это важно. Ведь смысл потреблять информацию, если не знаешь зачем она тебе, правильно? Так вот, в распределенных системах сбои - это норма. Может сеть лагать, могут падать узлы, сообщения между системами могут теряться или дублироваться. И вот здесь без понимания четкой семантики невозможно построить надежную бизнес-логику. Какие могут быть моменты, например: Думаю мало кто будет спорить с тем, что будет так себе... Поэтому давайте поговорим о семантике доставки. Какие бывают? Сообщение может быть доставлено только один раз, а может быть и вообще не доставлено. В этом случае у нас простая и быстрая реализация этого подхода, без механизма повторов. Самый главный риск - это то, что сообщение будет потеряно при сбоях. Как пример: это обычный HTTP запрос, если сбой по сети или что-то еще, то информация просто потеряется. Сообщение гарантировано будет доставлено, вместе с тем может быть доставлено повторно. Такой подход требует идемпотентно
Оглавление

Прежде чем грузить теорией, хочется описать почему это важно. Ведь смысл потреблять информацию, если не знаешь зачем она тебе, правильно?

Так вот, в распределенных системах сбои - это норма. Может сеть лагать, могут падать узлы, сообщения между системами могут теряться или дублироваться.

И вот здесь без понимания четкой семантики невозможно построить надежную бизнес-логику.

Какие могут быть моменты, например:

  • Что будет, если дважды спишутся деньги со счета?
  • Что будет, если заказ потеряется?
  • Что будет, если в целом получится ситуация, при которой у нас хранилище данных перейдет в неконсистентное состояние?

Думаю мало кто будет спорить с тем, что будет так себе... Поэтому давайте поговорим о семантике доставки. Какие бывают?

🙈At-most-once (не более одного раза)🙈

Сообщение может быть доставлено только один раз, а может быть и вообще не доставлено.

В этом случае у нас простая и быстрая реализация этого подхода, без механизма повторов.

Самый главный риск - это то, что сообщение будет потеряно при сбоях.

Как пример: это обычный HTTP запрос, если сбой по сети или что-то еще, то информация просто потеряется.

👍At-least-once (не менее одного раза)👍

Сообщение гарантировано будет доставлено, вместе с тем может быть доставлено повторно.

Такой подход требует идемпотентности обработчика сообщений, чтобы если будет доставлено повторно, то ничего бы не изменилось.

Такой подход используется большинством брокеров сообщений по-умолчанию (Kafka, RabbitMQ).

🚀Exactly-once (ровно один раз)🚀

Самая сложная и одновременно самая желанная - сообщение гарантировано будет доставлено и доставлено будет один раз.

Такой подход в свою очередь уже требует сложных механизмов для реализации: транзакций и согласования состояний.

Как вариант приближенный к этой модели - это Kafka с transactional producer + idempotent consumer.

✍️ Вместо вывода:

Тема важная для разработки и знать о ней нужно хотя бы с позиции понимания терминов, что они несут за собой, чтобы при столкновении было сразу понятно.

Разумеется, это быстрое overview цель которого приоткрыть вам дверь в этом вопросе.

Всем дочитавшим до конца спасибо за внимания, можем продолжить дискуссию в комментариях!

#семантика_доставки #Джавист_Роман #romankh3