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