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

被折叠的 条评论
为什么被折叠?



