техническое · ответ с источниками

Ключ идемпотентности: защита от повторной отправки писем

Ключ идемпотентности — уникальное значение, которое генерирует клиент и передаёт в API-запросе, чтобы операция была выполнена ровно один раз. Если запрос повторяется с тем же ключом, сервер распознаёт дубликат и возвращает исходный ответ, не выполняя действие повторно.

Как это работает

Когда клиент отправляет запрос с ключом идемпотентности, сервер сохраняет ключ и полученный ответ в кеше. Если затем приходит запрос с тем же ключом, сервер пропускает логику выполнения и просто возвращает ответ из кеша. Этот механизм критически важен для распределённых систем, где из-за сетевых тайм-аутов клиент может не знать, дошёл ли запрос до сервера.

Почему это важно для отправителей

В транзакционной почте двойная отправка одного и того же сообщения ухудшает пользовательский опыт и увеличивает число жалоб на спам. Ключи идемпотентности позволяют разработчикам агрессивно повторять неудавшиеся сетевые вызовы без риска отправить получателю дубликат письма. Это обеспечивает надёжность и согласованность всего конвейера доставки.

Что учесть в эксплуатации

Ключи следует генерировать как UUID или случайную строку с высокой энтропией, чтобы избежать коллизий. Обычно серверы удаляют такие ключи через 24 часа. Разработчики должны следить, чтобы ключ был привязан к конкретному назначению сообщения: если изменить тело письма или получателя, сохранив тот же ключ, должна возвращаться ошибка, а не закешированный успешный ответ.

Пример реализации

SaaS-приложение генерирует уникальный ключ для письма со сбросом пароля. Приложение вызывает email API, но соединение обрывается до получения ответа. Приложение повторяет запрос с тем же ключом. API видит, что ключ уже существует, и возвращает 200 OK, не отправляя пользователю второе письмо. Бесплатные инструменты SendHQ помогут разработчикам эффективно управлять почтовой инфраструктурой.

Обработка ошибок

Если запрос изменён, но отправлен с уже существующим ключом идемпотентности, сервер должен вернуть ошибку конфликта. Это предотвращает случайное повторное использование ключей для разных сообщений. Правильная обработка — перехватывать такие конфликты и генерировать новый ключ для обновлённой полезной нагрузки запроса.

Что спрашивают команды

Ключ идемпотентности — это то же самое, что идентификатор сообщения?

Нет. Идентификатор сообщения присваивает сервер после обработки, а ключ идемпотентности задаёт клиент до отправки запроса.

Что происходит, когда срок действия ключа идемпотентности истекает?

Если ключ удалён из кеша сервера, повторный запрос будет обработан как новый, и получателю может уйти дубликат письма.

Какой тип данных лучше всего подходит для ключей идемпотентности?

Отраслевой стандарт — UUID v4, поскольку вероятность коллизий в распределённых системах у него пренебрежимо мала.

Первоисточники