Операция идемпотентна, когда выполнение её дважды оставляет мир таким же, каким его оставило выполнение один раз. Удалить файл идемпотентно. Отправить сообщение — нет, и в этой асимметрии живёт большинство ошибок с дублями сообщений.
Где она действительно нужна
- В обработчиках вебхуков, потому что доставка — не менее одного раза, и повтор нормален.
- Во всём, что вы повторяете после истечения времени ожидания, потому что истекшее ожидание не говорит, дошла ли запись.
- Во всём, что очередь может доставить снова, то есть в любой очереди.
Как получить её дёшево
Ведите таблицу идентификаторов, на которые вы уже отреагировали, и вставляйте в неё с ограничением уникальности до того, как делать работу. Если вставка не прошла, кто-то уже это обработал. Вот и вся техника; ей не нужна библиотека, и она переживает перезапуск посередине, которого версия в памяти не переживает.
Вставляйте до, а не после. Вставка после оставляет окно между тем, чтобы сделать дело, и тем, чтобы записать, что вы его сделали, а падение в этом окне — ровно тот случай, который таблица и должна была закрыть.
Что взять идентификатором
То, как отправитель называет событие, если он даёт имя. Если не даёт, соберите ключ из полей, которые делают событие именно этим событием — аккаунт, диалог и сообщение, скажем, — и возьмите хеш. Ключ, выведенный из отметки времени, — не ключ: у повтора она другая.
Идемпотентность — не дедупликация в интерфейсе. К тому моменту, когда дубль доходит до экрана, второе сообщение уже отправлено. Проверка живёт в самом начале обработчика, до того как что-либо уйдёт.
Частые вопросы
Делают ли ИИ-агенты дубликаты вероятнее?
Могут. ИИ-агент, которого попросили дважды, может отправить дважды, а тот, что повторяет после тайм-аута, может не знать, что первая попытка удалась. Дайте ему правило в инструкциях — перечитать разговор, прежде чем отправлять снова, — и пусть отправки по-прежнему одобряет человек.
Идемпотентна ли кнопка «Применить в Google Ads» в проектной комнате?
Предложение в комнате выполняется один раз. Повторное нажатие на неё ничего не меняет.