在企业微信API开发中,如果多个任务同时处理消息,很容易遇到一个问题:单个任务运行正常,但并发执行时结果却不对。
比如同一个客户短时间内连续发送多条消息,系统同时启动多个处理任务,可能出现回复顺序错乱、客户状态被覆盖、重复创建工单等情况。
这类问题通常与并发控制有关。
为什么会出现数据错乱?
假设客户的跟进状态原本是"待处理"。
任务A读取状态后准备更新,任务B也读取了相同的旧状态。随后两个任务分别写入结果,后写入的数据可能覆盖先写入的数据。
这就是典型的并发更新问题。
常见的处理方式
1. 按业务对象串行处理
如果同一个客户或群聊的消息需要保持顺序,可以使用客户ID或群聊ID作为分组键,让同一组任务依次执行,不同组仍然可以并行处理。
2. 数据库使用事务
涉及多张表或多个字段的关联更新时,可以使用事务,避免只更新了一部分数据。
3. 使用乐观锁
给记录增加版本号。更新时检查版本是否发生变化,如果已经被其他任务修改,就重新读取并处理,而不是直接覆盖。
例如:
UPDATE customer
SET status = ?, version = version + 1
WHERE id = ? AND version = ?;
如果影响行数为 0,说明记录可能已经被其他任务更新,需要重新处理。
不要把所有任务都改成单线程
单线程虽然容易保证顺序,但会降低整体处理能力。
更合理的方式是根据业务要求决定并发范围:需要顺序的任务按客户或群聊分组处理,不相关的任务可以并行执行。
并发控制的重点不是禁止并发,而是明确哪些数据可以同时修改,哪些操作必须按顺序执行。