首页 > 其他分享 >消费幂等

消费幂等

时间:2024-04-25 09:34:56浏览次数:11  
标签:消费 重复 处理 消息 Message 扣款

为了防止消息重复消费导致业务处理异常,消息队列RocketMQ版的消费者在接收到消息后,有必要根据业务上的唯一Key对消息做幂等处理。本文介绍消息幂等的概念、适用场景以及处理方法。

什么是消息幂等

当出现消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次消费并未对业务系统产生任何负面影响,那么这个消费者的处理过程就是幂等的。

例如,在支付场景下,消费者消费扣款消息,对一笔订单执行扣款操作,扣款金额为100元。如果因网络不稳定等原因导致扣款消息重复投递,消费者重复消费了该扣款消息,但最终的业务结果是只扣款一次,扣费100元,且用户的扣款记录中对应的订单只有一条扣款流水,不会多次扣除费用。那么这次扣款操作是符合要求的,整个消费过程实现了消费幂等。

适用场景

在互联网应用中,尤其在网络不稳定的情况下,消息队列RocketMQ版的消息有可能会出现重复。如果消息重复会影响您的业务处理,请对消息做幂等处理。

消息重复的场景如下:

  • 发送时消息重复

    当一条消息已被成功发送到服务端并完成持久化,此时出现了网络闪断或者客户端宕机,导致服务端对客户端应答失败。 如果此时生产者意识到消息发送失败并尝试再次发送消息,消费者后续会收到两条内容相同但Message ID不同的消息。

  • 投递时消息重复

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

  • 负载均衡时消息重复(包括但不限于网络抖动、Broker重启以及消费者应用重启)

    当消息队列RocketMQ版的Broker或客户端重启、扩容或缩容时,会触发Rebalance,此时消费者可能会收到少量重复消息。

处理方法

因为不同的Message ID对应的消息内容可能相同,有可能出现冲突(重复)的情况,所以真正安全的幂等处理,不建议以Message ID作为处理依据。最好的方式是以业务唯一标识作为幂等处理的关键依据,而业务的唯一标识可以通过消息Key设置。

以支付场景为例,可以将消息的Key设置为订单号,作为幂等处理的依据。具体代码示例如下:

Message message = new Message();
message.setKey("ORDERID_100");
SendResult sendResult = producer.send(message);  

消费者收到消息时可以根据消息的Key,即订单号来实现消息幂等:

consumer.subscribe("ons_test", "*", new MessageListener() {
    public Action consume(Message message, ConsumeContext context) {
        String key = message.getKey()
        // 根据业务唯一标识的Key做幂等处理。
    }
});     

 

 

 

 

标签:消费,重复,处理,消息,Message,扣款
From: https://www.cnblogs.com/robots2/p/18156890

相关文章

  • 【专题】2023-2024年二手车市场消费需求洞察报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=36021原文出处:拓端数据部落公众号2023年,乘用车二手车市场展现出了蓬勃的发展态势,交易量攀升至1478万辆,同比增长高达15%,创下了近五年的新纪录。在这一繁荣景象的背后,以旧换新政策的助力功不可没,它极大地激发了消费者的换购热情,为二手车市场注入了......
  • kafka消息只能在一台服务器消费的问题解决过程
    场景:kafka消费端应用部署在两台机器上,其中一台能消费到生产端发出的kafka消息,另一台服务器接收不到任何消息。解决过程:一、从消费端启动日志中找出所有消费端线程2024-04-2320:04:44,726[xx_xxapp03-1556011171628-976bc2af_watcher_executor]INFOkafka.consumer.RangeA......
  • 一次 kafka 消费者的性能调优过程
    背景最近上线了一个kafka的消费者,数据规模大概是低峰期单机每分钟消费88W条,QPS14666。上线后看了下数据,进程CPU到了132%。 8核的机器,单进程CPU132倒也还好,但还是想看看,到底是咋回事。过程第一次排查&优化(协程池化->约为0优化)于是就开始采集pprof的数据。golangpprof的采......
  • Java并发(二十五)----异步模式之生产者/消费者
    1.定义要点与Java并发(二十二)----同步模式之保护性暂停中的保护性暂停中的GuardObject不同,不需要产生结果和消费结果的线程一一对应这样的好处是消费队列可以用来平衡生产和消费的线程资源生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据......
  • 【专题】2024年中国跨境进口电商B2C行业消费趋势白皮书报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=35940原文出处:拓端数据部落公众号报告合集指出,随着中国经济开放程度的加深和全球化的推进,跨境进口电商行业规模持续扩大,抖音电商全球购等平台成为国际品牌进入中国市场的重要跳板。消费者对品质生活的追求日益提升,对产品的专业性和真实性要求更加......
  • 顺通ERP:精细敏捷的设计理念,得到了消费者的喜爱
     顺通ERP是近年来备受关注的一款ERP品牌,其设计精细,操作便捷,备受消费者喜爱。那么,顺通ERP到底怎么样呢?属于什么档次呢? 首先,从品质上来看,顺通ERP具备高度的稳定性,能够确保企业的日常运营不受影响,软件经过严格的测试和验证,确保在各个环境下都能稳定运行。同时,软件还提供完善的......
  • Dubbo源码解读-Consumer消费端@Reference服务端引用流程
    上篇我们介绍了Provider端监听注册中心动态配置原理,地址如下Dubbo源码解析-Provider端监听注册中心动态配置原理-CSDN博客    本文主要针Dubbo消费端@Reference服务端引用流程原理,从dubbo源码角度进行解析。    大家可以好好仔细读一下本文。有疑问欢迎留言......
  • Springcloud学习笔记63---RocketMq超时重试,导致重复消费的问题,解决方案
    1.重复消费的背景当Consumer处理时间过长,在超时时间内没有返回给Broker消费状态,那么Broker也会自动重试。设定一个超时时间,达到超时时间的那个消费当作消费失败处理。Java客户端中的DefaultPushConsumer中的构造方法中的consumeTimeout字段(默认15分钟)。packagewilliam.rmq.......
  • 进程间通信(队列和生产者消费者模型)
    进程间通信(队列和生产者消费者模型)一、关于进程间通信[1]什么是进程间通信(Inter-ProcessCommunication,IPC)进程间通信(Inter-ProcessCommunication,IPC)是指两个或多个进程之间进行信息交换的过程。它是一种计算机编程技术,用于在不同进程之间共享数据和资源。[2]如何实......
  • 【专题】2023年全球数字消费者趋势调查中国篇报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=35727原文出处:拓端数据部落公众号数字消费者已成为市场的重要驱动力。他们通过互联网、移动设备等渠道获取信息、购买商品、进行社交,引领着消费市场的变革。中国数字消费者具有网络普及率高、追求个性化消费体验等特点,同时也面临网络安全、数据泄......