Проблема
Письма клиентам (со сбросом пароля, подтверждением заказа) не должны дублироваться. Но все внешние сервисы могут выдавать временные ошибки 5xx, и клиент, повторив запрос, рискует получить два письма.
Решение – идемпотентность на стороне получателя
В запросе на отправку письма нужно передавать уникальный идентификатор (например,
message_id = UUID, связанный с заказом или пользователем). Почтовый сервис должен хранить уже обработанные ID (хотя бы в течение суток) и при повторном запросе с тем же ID возвращать успех, не отправляя письмо повторно.Детали в требованиях
«Перед отправкой письма система должна генерировать уникальный
message_id (например, order_id + timestamp). Передавать его в заголовке или теле запроса».«Email-сервис должен реализовать проверку идемпотентности: если запрос с таким
message_id уже обрабатывался, вернуть 200 OK без повторной отправки».«Хранить ID не менее 24 часов для защиты от коллизий при сетевых задержках».
Почему не подходят другие варианты
A (не повторять) – письма могут теряться из-за сетевого сбоя. Надёжность упадёт.
C (увеличить таймаут) – не решает дублирование при повторе (пользователь нажал «отправить» дважды).
D (перестать пользоваться) – нереалистично.
Реальный кейс
Банк отправлял SMS с одноразовым кодом. Из-за ошибки в биллинге при повторе отправлялось две SMS. Клиенты путали код. После внедрения
message_id дубликаты прекратились.