ある操作は、2 回実行しても 1 回実行したあとと同じ世界を残すなら冪等です。ファイルの削除は冪等です。メッセージの送信は冪等ではなく、重複メッセージの不具合のほとんどはこの非対称のところに住んでいます。
本当に要るのはどこか
- Webhook のハンドラー。配信は少なくとも 1 回であり、再送は普通のことだからです。
- タイムアウトのあとに再試行するものすべて。タイムアウトは、書き込みが届いたかどうかを教えてくれないからです。
- キューが再配信しうるものすべて。つまり、あらゆるキューです。
安上がりに手に入れる方法
すでに処理した ID の表を持ち、仕事をする前に一意制約つきでそこへ挿入します。挿入が失敗したなら、誰かがもう処理しています。技法はこれで全部です。ライブラリは要らず、メモリ上の版では耐えられない途中の再起動にも耐えます。
あとではなく、先に挿入してください。あとに挿入すると、行為とその記録のあいだに窓ができます。その窓での停止こそ、この表が塞ぐはずだった事態です。
ID には何を使うか
送り手がそのイベントを何と呼んでいるか、名前をくれるならそれを。くれないなら、そのイベントをそのイベントたらしめている項目から鍵を組み立ててハッシュを取ります。たとえばアカウント、会話、メッセージです。時刻から導いた鍵は鍵ではありません。再送のときには別の値になります。
冪等性は画面での重複排除ではありません。重複が画面に届くころには、2 通めはもう送られています。この確認はハンドラーのいちばん上、何かが外へ出る前に置くものです。
よくある質問
AI エージェントは重複を起こしやすくしますか?
起こしやすくなりえます。2 回頼まれた AI エージェントは 2 回送るかもしれませんし、タイムアウト後に再試行するエージェントは、最初の試行が成功していたことに気づけないかもしれません。指示にルールを入れてください — もう一度送る前に、会話を読み直すこと — そして、送信を人が承認する形を保ってください。
プロジェクトルームの「Google Ads に適用」ボタンは冪等ですか?
ルームの提案は 1 回だけ実行されます。2 回目に押しても、何も変わりません。