Иллюзия порядка

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

Представь ситуацию: пользователь быстро создает, а затем удаляет виджет. Бэкенд отправляет два события: CreateWidget и DeleteWidget.

Из-за сетевых задержек (или гонок между консьюмерами) вторая система может получить событие DeleteWidget раньше, чем CreateWidget. Если мы просто проигнорируем попытку удаления несуществующего виджета, система окажется в несогласованном состоянии: удаленный виджет навсегда останется в базе.

Как это чинить?
  1. Использование Timestamp и Sequence ID: Каждому событию присваивается уникальный инкрементный номер или метка времени. Если консьюмер видит событие, которое «старше» уже обработанного, он может его отклонить.
  2. Упорядоченные партиции в брокере: (проходили это в мини-курсе по Kafka). Если все события с одним ключом (например, widget_id=123) отправляются строго в одну и ту же партицию, брокер гарантирует их последовательное чтение.
  3. Буфер консьюмера: Консьюмер задерживает обработку на пару секунд, собирает события в буфер, сортирует их по Sequence ID и только потом применяет к БД.