企业微信 API:同一业务被多次触发时,如何设计请求唯一标识避免重复执行

本文探讨企业微信API开发中因网络异常或用户重复操作导致的重复请求问题,重点介绍如何通过区分messageId与requestId、组合业务参数生成唯一标识、利用Redis原子校验及数据库唯一约束实现接口幂等性,并强调并发控制、超时处理与执行记录留存等关键实践。

在企业微信 API 开发中,同一业务被重复触发是比较常见的问题。

比如客户在外部群连续发送订单提交指令,或者消息回调因为网络异常被重复投递。如果后台每次都创建新任务,就可能出现重复订单、重复通知等情况。

使用星云API对接企业微信消息时,可以通过请求唯一标识和幂等控制,避免同一业务被重复执行。

相关接口参考顶部星云官网卡片里的接口文档 。

一、消息ID和业务请求ID要区分

实际开发中,建议使用两种不同的标识:

  • messageId: 用于识别消息本身,防止同一条消息被重复处理。

  • requestId: 用于识别业务请求,防止不同消息触发同一业务操作。

例如,客户连续发送两次相同的订单提交指令,虽然messageId不同,但对应的业务操作可能相同。

因此,仅依靠消息ID去重还不够。

二、如何生成业务唯一标识

可以根据业务类型组合关键参数。

例如:

requestKey =
客户ID + 业务类型 + 业务唯一编号

实际生成结果:

USER001:order_create:ORDER1001

其中,订单编号应使用稳定的业务标识,而不是每次请求临时生成的新编号。

如果业务没有天然唯一编号,可以在首次受理时生成幂等键,并要求后续重试沿用同一个标识。

三、通过Redis进行重复请求校验

收到业务请求后,可以使用Redis的SET NX EX进行原子校验。

const key = "task:" + requestKey;

const result = await redis.set(
  key,
  "PROCESSING",
  "EX",
  600,
  "NX"
);

if (result !== "OK") {
  return "该业务正在处理或已提交";
}

// 创建并执行后台任务

这里的600秒只是示例,实际有效期需要根据业务执行时间设置。

对于订单创建等重要操作,还应在数据库层增加唯一约束,不能只依赖Redis的过期键保证幂等。

四、重复请求的处理流程

接收企业微信消息
        ↓
解析客户与业务参数
        ↓
生成业务请求唯一标识
        ↓
检查是否存在相同业务
        ↓
   ┌──────┴──────┐
   ↓             ↓
 已存在        不存在
   ↓             ↓
查询原任务     创建新任务
   ↓             ↓
返回原任务状态  执行业务接口
                 ↓
              保存执行结果
                 ↓
              回复对应客户

如果原任务已经执行成功,可以根据业务规则返回已有结果,而不是重新执行。

五、实际开发需要注意的问题

1. 不要只用消息内容去重

不同客户可能发送相同指令,同一客户也可能对不同订单执行相同操作,需要结合业务参数判断。

2. 防止并发重复创建

多个请求同时到达时,必须使用原子操作或数据库唯一约束,避免两个请求同时通过校验。

3. 超时不代表执行失败

接口超时后,应先根据requestId查询实际业务结果,再决定是否重试。

4. 保留任务执行记录

建议保存requestId、taskId、客户ID、业务类型和执行状态,方便后续追踪。

六、总结

企业微信 API 中的重复请求处理,关键不是简单限制消息发送频率,而是准确识别同一业务操作。

通过消息ID去重、业务唯一标识、Redis原子校验和数据库幂等约束,可以有效减少重复创建任务和重复执行接口的问题。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值