开发微信机器人时,除了消息接收和自动回复,还需要考虑消息处理顺序。

例如,用户连续发送三条消息,后台却同时启动三个处理任务。如果每个任务都调用 AI 模型,后返回的结果可能先发送出去,导致回复顺序与用户的消息顺序不一致。

解决这类问题,可以从消息去重、任务队列和并发控制三个方面入手。

一、先处理重复消息

消息回调可能因为网络异常或上游重试而重复到达。机器人应尽可能根据可靠的消息唯一标识判断任务是否已经处理。

def should_process(message_id, processed_ids):
    if message_id in processed_ids:
        return False

    processed_ids.add(message_id)
    return True

这段代码仅用于演示判断逻辑。生产环境不能只依赖内存集合,因为程序重启后数据会丢失,多进程之间也无法共享状态。

实际项目可以使用数据库唯一索引或 Redis 原子操作完成去重,并记录任务处理状态。

二、同一会话按顺序处理

对于需要保持上下文的微信机器人,可以将消息按会话分组,同一个会话依次处理,不同会话则允许并行执行。

例如:

  • 会话 A:消息 1 → 消息 2 → 消息 3

  • 会话 B:可以与会话 A 并行处理

这样既能减少同一用户的上下文错乱,也能提高整体处理效率。

如果使用消息队列,可以根据会话标识分区或分组,并确保同一分组内的任务按要求串行执行。

三、控制任务并发量

如果每条消息都调用大语言模型或外部业务服务,并发过高可能造成接口限流、资源占用增加和响应延迟。

Python 中可以使用信号量限制同时执行的任务数量:

import asyncio

semaphore = asyncio.Semaphore(5)

async def process_message(message):
    async with semaphore:
        return await handle_business(message)

这里的 handle_business 是需要自行实现的异步业务函数,示例限制最多五个任务同时进入处理区。实际并发数量应根据服务能力、接口限流规则和响应时间进行调整。

注意:信号量只限制当前进程中的并发量。如果服务部署了多个实例,还需要考虑全局限流或分布式任务调度。

四、不要在消息接收接口里执行所有任务

消息接收模块应尽快完成必要的校验和任务登记,再由后台工作进程执行耗时操作,例如:

  • 调用 AI 模型

  • 查询业务数据库

  • 识别图片或语音

  • 执行复杂的消息规则

同时,应区分任务的接收状态、执行状态和发送状态。否则,即使业务处理成功,消息发送失败后也很难判断是否需要补偿。

对于可能重复执行的任务,还要考虑幂等处理,避免重试导致机器人重复回复。

总结

微信机器人并发处理的关键,是明确任务的唯一性、执行顺序和并发边界。小型项目可以先使用数据库任务表实现基础调度;随着消息量增加,再引入 Redis、RabbitMQ 等队列方案。

先保证消息不重复、顺序符合预期,再逐步提高并发能力,通常比一开始追求高并发更可靠。

API文档:GeWe API - GeWe API|微信 API 开发文档

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐