Проверяет понимание стратегий обработки дублирующихся событий в распределённых системах и идемпотентности.
В распределённых системах внешние сервисы могут отправлять одно и то же событие несколько раз из-за сетевых сбоев, повторных попыток доставки или ошибок в логике отправителя. Если обработчик не учитывает это, данные могут быть записаны дважды, что приведёт к некорректному состоянию системы.
Идемпотентность означает, что повторное выполнение операции даёт тот же результат, что и первое. Для обработки событий это достигается сохранением уникального идентификатора события и проверкой его перед выполнением бизнес-логики. Если событие уже обработано, обработчик просто пропускает его или возвращает сохранённый ответ.
// Пример на JavaScript с использованием Redis
async function handleEvent(event) {
const key = `event:${event.id}`;
const isProcessed = await redis.setnx(key, 'processed');
if (!isProcessed) {
console.log('Дубликат, пропускаем');
return;
}
// Выполняем бизнес-логику
await processEvent(event);
}Другой подход — использовать уникальный индекс на поле event_id в таблице. При попытке вставить дубликат база данных отклонит операцию, и приложение сможет обработать это как уже обработанное событие.
-- SQL: создание таблицы с уникальным ключом
CREATE TABLE processed_events (
event_id VARCHAR(255) PRIMARY KEY,
payload JSONB,
processed_at TIMESTAMP
);Вывод: Идемпотентность и дедупликация — обязательные практики для надёжной обработки событий в распределённых системах. Они защищают от потери данных и некорректных состояний, поэтому применяются в очередях сообщений, микросервисах и интеграциях с внешними API.