Un'operazione è idempotente quando eseguirla due volte lascia il mondo come l'ha lasciato eseguirla una. Cancellare un file è idempotente. Mandare un messaggio no, ed è in quell'asimmetria che vive quasi ogni difetto da messaggio doppio.
Dove serve davvero
- Nei gestori di webhook, perché la consegna è almeno una volta e un ritentativo è normale.
- In tutto ciò che ritentate dopo un tempo scaduto, perché un tempo scaduto non vi dice se la scrittura è andata a buon fine.
- In tutto ciò che una coda può riconsegnare, cioè qualunque coda.
Come ottenerla, a poco prezzo
Tenete una tabella degli id su cui avete già agito e inseriteci con un vincolo di unicità prima di fare il lavoro. Se l'inserimento fallisce, qualcuno se n'è già occupato. È tutta qui la tecnica; non serve nessuna libreria e sopravvive al riavvio a metà a cui una versione in memoria non sopravvive.
Inserite prima, non dopo. Inserire dopo lascia una finestra fra il fare la cosa e il registrare di averla fatta, e un crollo in quella finestra è esattamente il caso che la tabella doveva coprire.
Cosa usare come id
Come chiama l'evento chi lo manda, se un nome ve lo dà. Se non ve lo dà, costruite una chiave dai campi che rendono l'evento quell'evento — l'account, la conversazione e il messaggio, per dire — e fatene un hash. Una chiave ricavata da un orario non è una chiave: il ritentativo ne ha un'altra.
L'idempotenza non è deduplicare nell'interfaccia. Quando un doppione arriva su uno schermo, il secondo messaggio è già partito. Il controllo sta in cima al gestore, prima che esca qualunque cosa.
Domande frequenti
Gli agenti IA rendono più probabili i doppioni?
Possono. Un agente IA a cui si chiede due volte può inviare due volte, e uno che riprova dopo un timeout può non sapere che il primo tentativo è andato a buon fine. Dategli una regola nelle istruzioni — rileggere la conversazione prima di inviare di nuovo — e fate approvare gli invii a una persona.
Il pulsante Applica in una stanza di progetto è idempotente?
Una proposta in una stanza viene eseguita una sola volta. Premere Applica una seconda volta non cambia nulla.