Операція ідемпотентна, коли виконання її двічі лишає світ таким, яким його лишило виконання один раз. Видалити файл — ідемпотентно. Надіслати повідомлення — ні, і в цій асиметрії живе більшість помилок із дублями повідомлень.
Де вона справді потрібна
- В обробниках вебхуків, бо доставка — щонайменше один раз, і повтор нормальний.
- У всьому, що ви повторюєте після вичерпання часу очікування, бо вичерпаний час не каже, чи дійшов запис.
- У всьому, що черга може доставити знову, тобто в будь-якій черзі.
Як отримати її дешево
Ведіть таблицю ідентифікаторів, на які ви вже відреагували, і вставляйте в неї з обмеженням унікальності до того, як робити роботу. Якщо вставка не пройшла, хтось це вже опрацював. Ось і вся техніка; їй не потрібна бібліотека, і вона переживає перезапуск посередині, якого версія в пам'яті не переживає.
Вставляйте до, а не після. Вставка після лишає вікно між тим, щоб зробити справу, і тим, щоб записати, що ви її зробили, а падіння в цьому вікні — рівно той випадок, який таблиця мала закрити.
Що взяти за ідентифікатор
Те, як відправник називає подію, якщо він дає ім'я. Якщо не дає, зберіть ключ із полів, які роблять подію саме цією подією — обліковий запис, діалог і повідомлення, скажімо, — і візьміть хеш. Ключ, виведений із позначки часу, — не ключ: у повтору вона інша.
Ідемпотентність — не усунення дублів в інтерфейсі. На мить, коли дубль доходить до екрана, друге повідомлення вже надіслано. Перевірка живе на самому початку обробника, до того як щось піде назовні.
Часті запитання
Чи роблять ШІ-агенти дублікати ймовірнішими?
Можуть. ШІ-агент, якого попросили двічі, може надіслати двічі, а той, що повторює після тайм-ауту, може не знати, що перша спроба вдалася. Дайте йому правило в інструкціях — перечитати розмову, перш ніж надсилати знову, — і хай надсилання, як і раніше, схвалює людина.
Чи ідемпотентна кнопка «Застосувати в Google Ads» у проєктній кімнаті?
Пропозиція в кімнаті виконується один раз. Повторне натискання на неї нічого не змінює.