两个助手同时看见一张待处理订单,都回复“我来做”,随后各自调用收费模型。聊天里的认领没有约束业务系统,网络稍慢一点,同一张单就变成了两份支出。
工单认领、数据库条件更新和成熟队列都能承担这件事。工作由人串行处理时,一张明确分配表也许就够了。多个助手加入后,需要的是复用可靠的订单状态,而不是给每个窗口各存一份负责人。
可以让它们通过 EasyNet 调用同一个认领操作,提交业务订单编号,由订单服务一次性决定谁获得处理权。返回内容包含本次认领的有效标识,后续执行和提交都要核对它仍然有效。
转交时,订单服务更新当前负责人,旧助手即使恢复联网,也不能凭旧认领继续写入结果。执行身份用于验证谁在操作,运行连接本身的有效期则不能替代这张订单的归属检查。
外部收费请求还需要上游去重或任务查询。旧负责人可能在转交前已经发出了请求,这时仅拒绝它提交结果,并不能消除已发生的费用;接手方要先查明外部结果,再决定是否重新处理。
让两个测试助手同时认领,再让成功的一方断联、转交后重新上线。检查只有当前负责人能继续提交,迟到结果不会覆盖新状态,收费记录也能核对。顺利交接依靠这些业务约束,不是靠助手互相礼让。
- 01
订单服务认领
原子决定当前负责人
- 02
转交更新代次
旧认领不再有提交权
- 03
核对外部任务
已有费用不因转交消失
拒绝转交后的迟到结果
本地代次校验,不实现并发锁或数据库事务。生产认领必须由服务端原子更新,外部收费另行对账。
本地示例 · python
current = {"owner": "assistant-B", "generation": 2}
def submit(owner, generation, result):
if (owner, generation) != (current["owner"], current["generation"]):
raise PermissionError("stale claim")
return result
try:
submit("assistant-A", 1, "late result")
except PermissionError as error:
print(error)
assert submit("assistant-B", 2, "current result") == "current result"预期结果:A 的代次 1 被拒绝,B 的代次 2 可提交;不宣称这段内存代码实现多进程唯一认领。
接入时的检查项
- 并发认领只产生一个有效负责人,失败方不会继续收费执行。
- 转交后旧负责人提交被拒绝,任务状态不被迟到消息覆盖。
- 外部已启动动作有幂等或对账处理,不能仅凭认领成功宣称无重复费用。