Проверяет понимание обработки неупорядоченных событий в распределённых системах и стратегий их упорядочивания.
В распределённых системах события часто доставляются асинхронно, и порядок их получения может отличаться от порядка создания. Например, событие Success может прийти раньше, чем Pending, что нарушает логику обработки. Без специальных мер это приведёт к некорректному состоянию бизнес-процесса.
Допустим, у нас есть заказ, и события Pending и Success приходят в обратном порядке. Используем sequence number:
let lastProcessedSeq = 0;
const state = { status: 'unknown' };
function handleEvent(event) {
if (event.seq <= lastProcessedSeq) return; // игнорируем устаревшие
if (event.type === 'Pending' && state.status !== 'Success') {
state.status = 'Pending';
} else if (event.type === 'Success') {
state.status = 'Success';
}
lastProcessedSeq = event.seq;
}
handleEvent({ type: 'Success', seq: 2 }); // state.status = 'Success'
handleEvent({ type: 'Pending', seq: 1 }); // игнорируется, seq <= lastProcessedSeqЗдесь мы не даём более старому событию перезаписать новое состояние.
Подходы используются в event-driven архитектурах, системах на основе event sourcing, очередях сообщений (Kafka, RabbitMQ), а также при интеграции микросервисов. Например, в платёжных системах важно, чтобы финальный статус не был перезаписан более ранним событием.
Для корректной обработки неупорядоченных событий необходимо внедрять механизмы упорядочивания (sequence numbers, временные метки) и идемпотентность. Это гарантирует согласованность данных и предотвращает ошибки, связанные с поздней доставкой событий.