开发者社区 问答 正文

消费幂等怎么计算?



本文档主要强调 MQ 消费者在接收到消息以后根据业务上的唯一 Key 对消息做幂等处理的必要性。

消费幂等的必要性


在互联网应用中,尤其在网络不稳定的情况下,MQ 的消息有可能会出现重复,这个重复简单可以概括为以下两种情况:


  • 发送时消息重复【消息 Message ID 不同】:
    MQ Producer 发送消息场景下,消息已成功发送到服务端并完成持久化,此时网络闪断或者客户端宕机导致服务端应答给客户端失败。如果此时 MQ Producer 意识到消息发送失败并尝试再次发送消息,MQ 消费者后续会收到两条内容相同但是 Message ID 不同的消息。

  • 投递时消息重复【消息 Message ID 相同】;
    MQ Consumer 消费消息场景下,消息已投递到消费者并完成业务处理,当客户端给服务端反馈应答的时候网络闪断。为了保证消息至少被消费一次,MQ 服务端将在网络恢复后再次尝试投递之前已被处理过的消息,MQ 消费者后续会收到两条内容相同并且 Message ID 也相同的消息。


处理建议


基于上述第一种原因,内容相同的消息 Message ID 可能会不同,真正安全的幂等处理,不建议以 Message ID 作为处理依据。最好的方式是以业务唯一标识作为幂等处理的关键依据,而业务的唯一标识可以通过消息 Key 进行设置:
  1. Message message = new Message();
  2. message.setKey("ORDERID_100");
  3. SendResult sendResult = producer.send(message);

订阅方收到消息时可以根据消息的 Key 进行幂等处理:
  1. consumer.subscribe("ons_test", "*", new MessageListener() {
  2.     public Action consume(Message message, ConsumeContext context) {
  3.         String key = message.getKey()
  4.         // 根据业务唯一标识的 key 做幂等处理
  5.     }
  6. });

展开
收起
猫饭先生 2017-10-26 13:58:23 2335 分享 版权
阿里云 AI 助理回答

在互联网应用的背景下,消息队列(MQ)作为分布式系统中重要的通信组件,承担着解耦、异步处理和负载均衡等关键职责。然而,在网络不稳定或系统异常的情况下,消息重复成为了一个不可忽视的问题,直接关系到业务数据的一致性和准确性。因此,实现消费幂等性对于确保系统的健壮性和可靠性至关重要。

消费幂等的必要性

  1. 保障数据一致性:在支付、订单处理等核心业务场景中,若同一笔交易因消息重复而被多次执行,可能导致用户被错误扣款、订单状态混乱等严重后果。通过实施消费幂等,确保即使消息被多次消费,业务逻辑也仅被执行一次,从而维护了数据的准确与一致。

  2. 提升系统稳定性:网络波动、服务重启等情况可能触发消息重投,消费幂等机制能够有效应对这些不确定性因素,减少因重复处理引发的系统异常,增强系统的稳定运行能力。

  3. 简化问题排查:幂等设计简化了对重复消息导致的异常情况的定位和修复过程,因为无论消息被消费多少次,最终业务状态保持不变,降低了故障排查的复杂度。

处理建议

  • 使用业务唯一标识作为幂等键:鉴于Message ID在某些情况下可能出现重复,推荐采用业务层面的唯一标识(如订单号、用户ID结合操作类型等)作为幂等处理的关键依据。这样可以确保即使消息内容相同但Message ID不同,也能正确识别并处理重复消息。

  • 消息发送时设置Key

    Message message = new Message();
    message.setKey("ORDERID_100"); // 使用订单ID作为Key
    SendResult sendResult = producer.send(message);
    
  • 消费者端实现幂等逻辑

    consumer.subscribe("ons_test", "*", new MessageListener() {
      public Action consume(Message message, ConsumeContext context) {
          String key = message.getKey(); // 获取消息Key
          // 根据key检查业务系统中是否已处理该消息,未处理则执行并标记为已处理,已处理则直接忽略
      }
    });
    

总结

消费幂等性的实现是构建高可用、高性能分布式系统不可或缺的一环,特别是在依赖消息队列进行通信的应用中。通过以业务唯一标识为基础的幂等处理策略,可以有效地解决消息重复带来的数据不一致风险,增强系统的健壮性和用户体验。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: