企业微信二次开发中,消息系统是高频模块。客户消息、员工消息、外部群消息、历史消息、文件消息、自动回复消息、工单关联消息,都可能进入系统。如果消息系统没有幂等设计,就会出现重复入库、重复回复、重复创建任务、重复生成工单等问题。
幂等在消息系统里尤其重要,因为消息事件可能重复推送,历史同步可能重复拉取,任务失败后可能重新执行,人工补偿也可能再次触发处理。
一、消息为什么会重复
消息重复通常来自几个来源。
第一,回调重试。系统没有及时响应或响应异常时,消息事件可能被重复推送。
第二,历史消息同步。系统拉取历史消息时,如果游标处理不当,可能拉到已经处理过的消息。
第三,任务重试。消息处理任务失败后,重试时可能再次执行部分业务逻辑。
第四,人工补偿。管理员重新处理某个事件时,也可能导致重复执行。
因此,消息系统必须默认“同一条消息可能出现多次”。
二、消息入库幂等
消息入库的第一层幂等,是保证同一条消息只保存一次。通常需要依赖消息唯一标识。如果消息本身有稳定唯一标识,应优先使用。如果没有,则可以结合会话标识、发送人、接收人、消息类型、时间戳和内容摘要生成唯一判断。
但要注意,生成唯一键时不能太粗。比如只用内容和时间,可能误判不同客户发送的相同内容。也不能太细,否则重复消息无法识别。
消息入库幂等解决的是数据重复问题,但还没有解决业务动作重复问题。
三、业务处理幂等
一条消息入库后,可能触发多种业务动作:
自动回复
人工接管提醒
工单候选
客户跟进记录
标签更新
群风险提醒
消息路由任务
这些动作也必须幂等。
例如同一条客户消息重复处理时,不能重复发送自动回复。可以在自动回复记录中保存消息 ID 和规则 ID,保证同一消息同一规则只执行一次。
工单候选也一样。同一消息只能生成一个候选记录,重复处理时只更新状态,不重复创建。
四、自动回复幂等
自动回复是客户可见动作,更需要严格幂等。重复发送同样的自动回复,会直接影响客户体验。
自动回复幂等可以从几个层面控制:
消息级:同一条消息只触发一次回复。
规则级:同一规则在同一群内短时间只回复一次。
客户级:同一客户短时间内不重复收到相同回复。
会话级:人工接管后暂停自动回复。
这些控制不是互相替代,而是叠加保护。
五、任务重试中的幂等
消息处理任务可能失败后重试。重试时不能假设之前所有步骤都没执行。可能消息已入库,自动回复已发送,但工单候选创建失败。
这时如果整个任务从头执行,就可能重复回复。更好的方式是任务步骤化,每个步骤都有自己的执行状态和幂等判断。
比如:
消息归档步骤已完成。
规则匹配步骤已完成。
自动回复步骤已完成。
工单候选步骤失败。
重试时只需要继续失败步骤,而不是重新执行全部逻辑。
六、幂等与日志
幂等不是静默丢弃重复事件。重复事件也应该记录。系统可以记录重复次数、最后重复时间和来源。这样可以发现某些回调是否异常重复,或某些任务是否频繁重试。
当自动回复没有发送时,也应记录原因。例如已经回复过、命中频率限制、处于人工接管、规则被禁用等。否则业务人员可能误以为系统漏处理。
七、总结
企业微信消息系统的幂等设计,不能只停留在消息表唯一索引。它需要覆盖消息入库、任务执行、自动回复、工单候选、人工提醒和日志记录。
真正稳定的消息系统,应该做到同一条消息重复到达时,数据不重复、回复不重复、任务不重复、业务结果不重复,同时还能保留可追踪记录。幂等设计越早做,后期消息系统越稳定。