easynet.run · 全部问题场景

同一张单由谁负责,转交时别变成双份执行

两个助手同时看见一张待处理订单,都回复“我来做”,随后各自调用收费模型。聊天里的认领没有约束业务系统,网络稍慢一点,同一张单就变成了两份支出。

工单认领、数据库条件更新和成熟队列都能承担这件事。工作由人串行处理时,一张明确分配表也许就够了。多个助手加入后,需要的是复用可靠的订单状态,而不是给每个窗口各存一份负责人。

可以让它们通过 EasyNet 调用同一个认领操作,提交业务订单编号,由订单服务一次性决定谁获得处理权。返回内容包含本次认领的有效标识,后续执行和提交都要核对它仍然有效。

转交时,订单服务更新当前负责人,旧助手即使恢复联网,也不能凭旧认领继续写入结果。执行身份用于验证谁在操作,运行连接本身的有效期则不能替代这张订单的归属检查。

外部收费请求还需要上游去重或任务查询。旧负责人可能在转交前已经发出了请求,这时仅拒绝它提交结果,并不能消除已发生的费用;接手方要先查明外部结果,再决定是否重新处理。

让两个测试助手同时认领,再让成功的一方断联、转交后重新上线。检查只有当前负责人能继续提交,迟到结果不会覆盖新状态,收费记录也能核对。顺利交接依靠这些业务约束,不是靠助手互相礼让。

  1. 01

    订单服务认领

    原子决定当前负责人

  2. 02

    转交更新代次

    旧认领不再有提交权

  3. 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 可提交;不宣称这段内存代码实现多进程唯一认领。

接入时的检查项
  • 并发认领只产生一个有效负责人,失败方不会继续收费执行。
  • 转交后旧负责人提交被拒绝,任务状态不被迟到消息覆盖。
  • 外部已启动动作有幂等或对账处理,不能仅凭认领成功宣称无重复费用。
源码与接入资料