# 同一张单由谁负责,转交时别变成双份执行 | EasyNet Source: https://easynet.run/cases/problems/single-owner-for-one-order [easynet.run · 全部问题场景](https://easynet.run/cases#problem-scenarios) # 同一张单由谁负责,转交时别变成双份执行 两个助手同时看见一张待处理订单,都回复“我来做”,随后各自调用收费模型。聊天里的认领没有约束业务系统,网络稍慢一点,同一张单就变成了两份支出。 工单认领、数据库条件更新和成熟队列都能承担这件事。工作由人串行处理时,一张明确分配表也许就够了。多个助手加入后,需要的是复用可靠的订单状态,而不是给每个窗口各存一份负责人。 可以让它们通过 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 可提交;不宣称这段内存代码实现多进程唯一认领。 接入时的检查项 并发认领只产生一个有效负责人,失败方不会继续收费执行。 转交后旧负责人提交被拒绝,任务状态不被迟到消息覆盖。 外部已启动动作有幂等或对账处理,不能仅凭认领成功宣称无重复费用。 源码与接入资料 [让 Agent 调用业务操作,而不是拿到后台凭证](https://easynet.run/cases/enterprise-tool-boundary) [函数接入指南](https://easynet.run/docs/connect/function)