一个操作,如果执行两遍之后留下的世界和执行一遍之后一样,它就是幂等的。删除文件是幂等的。发送消息不是,而绝大多数重复消息的毛病,就住在这份不对称里。
真正需要它的地方
- webhook 处理器里,因为投递是至少一次,重投是常事。
- 任何你在超时之后会重试的东西里,因为超时并不告诉你那次写入到底落没落。
- 任何队列可能重新投递的东西里,也就是每一个队列。
怎样便宜地拿到它
留一张表记下你已经处理过的 id,在干活之前先带着唯一约束往里插。如果插入失败,说明有人已经处理过这一条了。整套技巧就这么多;它不需要任何库,而且能挺过中途重启,内存里的那种版本挺不过去。
要先插,不要后插。后插会在做这件事和记下你做过之间留出一个窗口,而恰恰是在那个窗口里的崩溃,才是这张表本来要兜住的情形。
拿什么当 id
发送方管这个事件叫什么就用什么,前提是它给了名字。如果没给,就用那些使这个事件成为这个事件的字段拼一把钥匙 — 比如账号、会话和消息 — 再取哈希。从时间戳推出来的钥匙不是钥匙:重投时它就变了。
幂等性不是在界面上去重。等到一条重复的消息出现在屏幕上时,第二条你早就发出去了。这道检查属于处理器的最顶上,在任何东西出门之前。
常见问题
AI 智能体会让重复更容易出现吗?
会。被问了两次的 AI 智能体可能发两次,超时后重试的智能体可能不知道第一次已经成功。在它的指令里给它一条规则 — 再次发送之前,先把对话读回来 — 并且让真人批准每一次发送。
项目房间里的“在 Google Ads 中应用”按钮是幂等的吗?
房间里的一个建议只运行一次。对它再按一次,什么都不会改变。