Объясняет идемпотентность и доставку сообщений.
Очереди (например, Redis Streams) гарантируют идемпотентную обработку через уникальные ID сообщений и подтверждения (ack). При падении транзакции сообщение возвращается в очередь и отправляется один раз.
Сценарий дублирования без очереди:
Транзакция коммитится → отправляется алерт.
Приложение падает до получения ответа → алерт отправляется повторно.
Решение с Redis Streams:
// Генерация уникального ID сообщения
XADD alerts * "alert_id" "123" "message" "Ошибка!" Consumer:
while (true) {
var records = redis.xread("alerts", lastId);
for (var record : records) {
try {
process(record);
redis.xack("alerts", record.id()); // Подтверждение обработки
} catch (Exception e) {
// Сообщение остаётся в очереди для повторной попытки
}
}
}Идемпотентность:
Сервис алертов проверяет alert_id в БД перед отправкой.
Вывод: Очереди + уникальные ID + идемпотентность исключают дубли.