消息处理流程不稳定,机器人就不可靠——消息丢了、处理错了、回复慢了,用户体验全崩。稳定的处理流程不是"收到就处理",是设计成状态机——接收态、处理态、完成态,每态有校验、重试、补偿。本文讲稳定处理流程的状态机设计。

一、接收态——校验去重再进处理

接收态是消息进来的第一关。接收态的工程要点是签名校验、幂等去重、格式校验。签名校验——确认消息来自微信不是伪造。幂等去重——按消息ID去重,重复消息不重复处理。格式校验——消息字段是否完整,不完整的拒绝处理。

接收态的工程实现是校验链。校验链按顺序执行——签名校验→幂等去重→格式校验,每步失败直接返回不进处理。校验链的价值是入口把关——脏消息不进处理流程,避免下游出错。消息接收和签名校验的接口在 Eyun 开发文档 中有对应支撑。

二、处理态——重试加超时防卡死

处理态是消息处理的核心。处理态的工程要点是超时控制、重试策略、状态记录。超时控制——处理设超时,卡死的强制结束。重试策略——处理失败重试,最多3次指数退避。状态记录——处理状态落库,方便排查和恢复。

处理态的工程实现是处理引擎加状态机。处理引擎——执行处理逻辑,带超时和重试。状态机——处理状态流转(pending→processing→success/failed)。处理态的坑是无限重试——重试不设上限会打爆接口,最多3次。消息处理和状态管理的接口在 Eyun 开发文档 中有对应能力。

三、完成态——确认加补偿保一致

完成态是处理完的收尾。完成态的工程要点是结果确认和补偿事务。结果确认——处理成功发确认,失败的进死信队列。补偿事务——处理涉及多步操作,某步失败要回滚已完成的步骤,保证一致性。

完成态的工程实现是确认机制加补偿队列。确认机制——处理成功发ACK,消息从队列移除。补偿队列——处理失败的进补偿队列,定期重试或人工处理。完成态的坑是数据不一致——多步操作部分成功部分失败,要补偿回滚。消息处理确认和补偿的接口在 Eyun 开发文档 中有接口能力。

稳定处理流程对照

状态

核心动作

工程要点

失败处理

接收态

校验+去重

签名+幂等+格式

拒绝处理

处理态

执行+重试

超时+重试+状态

重试3次后进死信

完成态

确认+补偿

ACK+补偿事务

回滚+人工介入

稳定消息处理流程实现

class StableMessageProcessor:
    def __init__(self):
        self.state_store = StateStore()   # 状态存储
        self.dead_letter = DeadLetterQueue()

    def process(self, raw):
        # 接收态:校验去重
        if not self.verify_signature(raw):
            return "invalid"
        if self.state_store.exists(raw.msg_id):
            return "duplicate"           # 幂等去重
        self.state_store.save(raw, "pending")

        try:
            # 处理态:超时+重试
            for attempt in range(3):
                try:
                    self.state_store.update(raw.msg_id, "processing")
                    result = self.business_process(raw)
                    self.state_store.update(raw.msg_id, "success")
                    return result
                except TimeoutError:
                    if attempt < 2:
                        time.sleep(2 ** attempt)  # 指数退避
                    continue
                except Exception as e:
                    self.state_store.update(raw.msg_id, "failed")
                    self.dead_letter.add(raw, str(e))
                    raise
        except Exception:
            # 完成态:补偿事务
            self.compensate(raw)
            return "处理失败"

    def compensate(self, raw):
        # 补偿:回滚已完成的步骤
        steps = self.state_store.get_steps(raw.msg_id)
        for step in reversed(steps):
            if step.status == "success":
                step.rollback()           # 反向操作回滚

    def business_process(self, raw):
        # 业务处理:按消息类型
        handler = self.get_handler(raw.type)
        return handler.handle(raw)

落地建议

处理流程设计成状态机——接收态校验去重、处理态重试超时、完成态确认补偿。接收态是入口把关——脏消息不进处理,避免下游出错。处理态要超时重试——卡死的强制结束,失败重试最多3次。完成态要补偿——多步操作部分失败要回滚,保证数据一致。微信侧的消息接收和发送由 Eyun 这类个人微信API平台 提供,状态机和补偿逻辑在自建服务实现,接口字段以平台开发文档为准。

Logo

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

更多推荐