Table of Contents

一、出现非幂等性的情况

二、解决办法

1、mq接收生产者传来的消息:

2、消费者消费mq中的消息:

三、重复消费可能会在什么场景下出现(以kafka为例)

怎么保证消息队列消费的幂等性?


一、出现非幂等性的情况

  • 1、生产者已把消息发送到mq,在mq给生产者返回ack的时候网络中断,故生产者未收到确定信息,生产者认为消息未发送成功,但实际情况是,mq已成功接收到了消息,在网络重连后,生产者会重新发送刚才的消息,造成mq接收了重复的消息
  • 2、消费者在消费mq中的消息时,mq已把消息发送给消费者,消费者在给mq返回ack时网络中断,故mq未收到确认信息,该条消息会重新发给其他的消费者,或者在网络重连后再次发送给该消费者,但实际上该消费者已成功消费了该条消息,造成消费者消费了重复的消息;

二、解决办法

1、mq接收生产者传来的消息:

mq内部会为每条消息生成一个全局唯一、与业务无关的消息id,当mq接收到消息时,会先根据该id判断消息是否重复发送,mq再决定是否接收该消息。

2、消费者消费mq中的消息:

也可利用mq的该id来判断,或者可按自己的规则生成一个全局唯一id,每次消费消息时用该id先判断该消息是否已消费过


  • 比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了,你就别插入了,update 一下好吧。(高并发会有问题)
  • 比如你是写 Redis,那没问题了,反正每次都是 set,天然幂等性。

比如你不是上面两个场景,那做的稍微复杂一点,你需要让生产者发送每条数据的时候,里面加一个全局唯一的 id,类似订单 id 之类的东西,然后你这里消费到了之后,先根据这个 id 去比如 Redis 里查一下,之前消费过吗?如果没有消费过,你就处理,然后这个 id 写 Redis。如果消费过了,那你就别处理了,保证别重复处理相同的消息即可。

比如基于数据库的唯一键来保证重复数据不会重复插入多条。因为有唯一键约束了,重复数据插入只会报错,不会导致数据库中出现脏数据。 - https://www.cnblogs.com/windpoplar/p/10747201.html

三、重复消费可能会在什么场景下出现(以kafka为例)

 kafka实际上有个offset的概念,就是每个消息写进去,都有一个offset,代表他的序号,

  然后consumer消费了数据之后,每隔一段时间,会把自己消费过的消息的offset提交一下,代表我已经消费过了,下次我要是重启啥的,你就让我继续从上次消费到的offset来继续消费吧。

  但是凡事总有意外,就是你有时候重启系统,直接kill进程了,再重启。这会导致consumer有些消息处理了,但是没来得及提交offset。

  重启之后,少数消息会再次消费一次。

  其实重复消费不可怕,可怕的是你没考虑到重复消费之后,怎么保证幂等性。

  假设你有个系统,消费一条往数据库里插入一条,要是你一个消息重复两次,你不就插入了两条,这数据不就错了?但是你要是消费到第二次的时候,自己判断一下已经消费过了,直接扔了,不就保留了一条数据?   一条数据重复出现两次,数据库里就只有一条数据,这就保证了系统的幂等性   幂等性,我通俗点说,就一个数据,或者一个请求,给你重复来多次,你得确保对应的数据是不会改变的,不能出错。

怎么保证消息队列消费的幂等性?

如何保证MQ的消费是幂等性的,需要结合具体的业务来看  :

  比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了,你就别插入了,update一下好吧

  比如你是写redis,那没问题了,反正每次都是set,天然幂等性

  比如你不是上面两个场景,那做的稍微复杂一点,你需要让生产者发送每条数据的时候,里面加一个全局唯一的id,类似订单id之类的东西,然后你这里消费到了之后,先根据这个id去比如redis里查一下,之前消费过吗?如果没有消费过,你就处理,然后这个id写redis。如果消费过了,那你就别处理了,保证别重复处理相同的消息即可。

  还有比如基于数据库的唯一键来保证重复数据不会重复插入多条,拿到数据的时候,每次重启可能会有重复,因为kafka消费者还没来得及提交offset,重复数据拿到了以后我们插入的时候,因为有唯一键约束了,所以重复数据只会插入报错,不会导致数据库中出现脏数据。

转自:中华石杉Java工程师面试突击 https://www.cnblogs.com/mengchunchen/p/10007537.html

消息队列MQ如何保证消息的幂等性相关推荐

  1. 消息队列面试 - 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?

    消息队列面试 - 如何保证消息不被重复消费? 面试题 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性? 面试官心理分析 其实这是很常见的一个问题,这俩问题基本可以连起来问.既然是消费消息, ...

  2. 消息队列面试 - 如何保证消息的可靠性传输?

    消息队列面试 - 如何保证消息的可靠性传输? 面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 面试官心理分析 这个是肯定的,用 MQ 有个基本原则,就是数据不能多一条,也不能少一条 ...

  3. 消息队列面试 - 如何保证消息的顺序性?

    消息队列面试 - 如何保证消息的顺序性? 面试题 如何保证消息的顺序性? 面试官心理分析 其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的 ...

  4. 消息队列MQ与微消息队列MQTT

    文章目录 参考文章 什么是消息队列,什么是RPC 为什么要使用MQ消息队列 1. 解耦(可用性) 2. 流量削峰 3. 数据分发 消息队列的缺点 多种主流传统消息队列MQ对比 传统消息队列Rocket ...

  5. 消息队列面试 - 如何保证消息队列的高可用?

    面试题 如何保证消息队列的高可用? 面试官心理分析 如果有人问到你 MQ 的知识,高可用是必问的.上一讲提到,MQ 会导致系统可用性降低.所以只要你用了 MQ,接下来问的一些要点肯定就是围绕着 MQ ...

  6. 高薪程序员面试题精讲系列127之如何设计一个消息队列?如何保证消息的执行顺序?

    一. 面试题及剖析 1. 今日面试题 如何保证消息队列中消息的执行顺序? RabbitMQ消息过期了怎么办? 如何设计一个消息队列? 如果让你自己设计一个消息队列,该怎么实现? 2. 题目剖析 壹哥在 ...

  7. rabbitmq接收不到消息_分布式消息队列:如何保证消息的可靠性传输

    rabbitmq (1)生产者弄丢了数据 生产者将数据发送到rabbitmq的时候,可能数据就在半路给搞丢了,因为网络啥的问题,都有可能. 此时可以选择用rabbitmq提供的事务功能,就是生产者发送 ...

  8. 消息队列MQ夺命连环11问:kafka、rabbitmq、rocketmq、activemq

    <消息队列MQ如何保证消息的幂等性> <RabbitMQ架构> <ZeroMQ简介:一种高性能的异步消息传递库> <Rocketmq原理&最佳实践&g ...

  9. 消息队列MQ 之 Kafka

    目录 前言 一.消息队列 MQ 为什么需要消息队列(MQ) 使用消息队列的好处 消息队列的两种模式 二.Kafka 概述 Kafka 简介 Kafka 的特性 三 实验 前言 一.消息队列 MQ MQ ...

最新文章

  1. hadoop job 数量_大数据Hadoop常见面/笔试题
  2. php 语言文件操作,php中目录文件操作详谈
  3. ORACLE-osi分层模型.md
  4. DL之DilatedConvolutions:Dilated Convolutions(膨胀卷积/扩张卷积)算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  5. java动态代理实现与原理详细分析(代码层面解释了AOP的实现)
  6. Nacos发布0.5.0版本,轻松玩转动态 DNS 服务
  7. BZOJ 1878: [SDOI2009]HH的项链( BIT )
  8. C#通过WebClient/HttpWebRequest实现http的post/get方法
  9. MySQL Semisync
  10. PL/SQL 快捷键设置
  11. IE6 与 GZIP, BUG汇总
  12. 求最大公约数(辗转相除法)
  13. EXCEL 基础函数大全
  14. 美国 ZIP Code 一览表
  15. WPS桌面右键新建菜单缺少新建文档入口
  16. oracle写一个全量刷新,Oracle物化视图定时全量刷新导致归档日志骤增
  17. HIT CS科班对计算机专业素养的理解
  18. 分析DuxCms之AdminController
  19. AutoRun机制详解
  20. 发射蓝色/绿色/红外金属卤化物CsPbBr钙钛矿量子点发光二极管

热门文章

  1. 商业大亨微信草花服务器,商业大亨2每日答题和服务器进度奖励
  2. java 时间日期视频_40-日期和时间-JAVA和C#语法比较 - 视频教程 - 北盟网校 - 专注原创教学第一站...
  3. Redis主从、哨兵模式的搭建
  4. 前端知识点总结——VUE
  5. 插件五之滚动条jquery.slimscroll.js
  6. 【Android笔记】MediaPlayer基本用法
  7. 作为90后迈向成为一个优秀的男人系列之二
  8. 基于CentOs的Hadoop集群全分布式部署
  9. mapxtreme java manger web 应用程序牛刀小试
  10. 装完金蝶电脑无限重启_金蝶财务软件快捷键大全,提高工作效率!