分析:这个问题其实换一种问法就是,如何保证消息队列的幂等性?这个问题可以认为是消息队列领域的基本问题。换句话来说,是在考察你的设计能力,这个问题的回答可以根据具体的业务场景来答,没有固定的答案。

回答:先来说一下为什么会造成重复消费?
其实无论是哪种消息队列,造成重复消费原因其实都是类似的。正常情况下,消费者在消费消息的时候,消费完毕后,会发送一个确认消息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除。只是不同的消息队列发出的确认消息形式不同,例如RabbitMQ是发送一个ACK确认消息,RocketMQ是返回一个CONSUME_SUCCESS成功标志,kafka实际上有个offet的概念,简单说一下,就是每一个消息都有一个offset,kafka消费过消息后,需要提交offset,让消息队列知道自己已经消费过了。

那造成重复消费的原因?,就是因为网络传输等等故障,确认信息没有传送到消息队列,导致消息队列不知道自己已经消费过该消息了,再次将消息分发给其他的消费者。

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

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

如何解决?这个问题针对业务场景来答,分以下三种情况:

(1)比如,你拿到这个消息做数据库的insert操作,那就容易了,给这个消息做一个唯一的主键,那么就算出现重复消费的情况,就会导致主键冲突,避免数据库出现脏数据。

(2)再比如,你拿到这个消息做redis的set的操作,那就容易了,不用解决,因为你无论set几次结果都是一样的,set操作本来就算幂等操作。

(3)如果上面两种情况还不行,上大招。准备一个第三方介质,来做消费记录。以redis为例,给消息分配一个全局id,只要消费过该消息,将<id,message>以K-V形式写入redis.那消费者开始消费前,先去redis中查询有没有消费记录即可,先根据这个id去比如redis里查一下,之前消费过吗?如果没有消费过,你就处理,然后这个id写redis。如果消费过了,那你就别处理了,保证别重复处理相同的消息即可。

如何保证消息不被重复消费~~~~~(如何保证消息队列的幂等性)相关推荐

  1. rabbitmq如何保证消息不被重复消费_RabbitMQ保证消息可靠投递与消费的正确使用姿势...

    前言 MQ 是什么?MQ 我们可以理解为消息队列. 队列是什么?队列我们可以理解为管道. 即以管道的方式做消息传递. 场景展示: 1.我们在双11的凌晨大量秒杀和抢购商品,然后去结算的时候,发现界面会 ...

  2. RabbitMQ如何防止消息丢失及重复消费

    RabbitMQ目录 文章目录 RabbitMQ如何防止消息丢失及重复消费 一.消息丢失 1.1.生产者没有成功把消息发送到MQ 1.1.1.confirm(发布确认)机制 1.1.2.事务机制 1. ...

  3. 如何保证消息不被重复消费啊(如何保证消息消费时的幂等性)?

    1.面试题 如何保证消息不被重复消费啊(如何保证消息消费时的幂等性)? 2.面试官心里分析 其实这个很常见的一个问题,这俩问题基本可以连起来问.既然是消费消息,那肯定要考虑考虑会不会重复消费?能不能避 ...

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

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

  5. 阿里面试题剖析,如何保证消息不被重复消费?

    2019独角兽企业重金招聘Python工程师标准>>> 面试题 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性? 面试官心理分析 其实这是很常见的一个问题,这俩问题基本可 ...

  6. RabbitMQ常见问题解决方案——消息丢失、重复消费、消费乱序、消息积压

    文章目录 背景 RabbitMQ常见问题解决方案 1. RabbitMQ的可靠性(消息丢失问题) 1.1 生产者丢失消息 1.2 RabbitMQ弄丢消息 1.2.1 交换机持久化 1.2.2 队列持 ...

  7. Kafka高吞吐原理及如何保证不丢失不重复消费

    原文:Kafka如何保证不丢失不重复消费 - 知乎 一.如何保证百万级写入速度: 目录 1.页缓存技术 + 磁盘顺序写 2.零拷贝技术 3.最后的总结 "这篇文章来聊一下Kafka的一些架构 ...

  8. kafka的消息丢失和重复消费解决办法

    1.消息发送 Kafka消息发送有两种方式:同步(sync)和异步(async),默认是同步方式,可通过producer.type属性进行配置.Kafka通过配置request.required.ac ...

  9. 解决RabbitMQ消息丢失与重复消费问题

    解决RabbitMQ消息丢失与重复消费问题 参考文章: (1)解决RabbitMQ消息丢失与重复消费问题 (2)https://www.cnblogs.com/sessionbest/articles ...

最新文章

  1. 你也许只使用到了 VS Code 20% 的功能
  2. Spring MVC 处理异常的3种方式
  3. PB做的史上最强的矢量图监控软件(什么组态软件与监控软件的核心都源于此原理)...
  4. 程序员修炼之路:你该知道的 7 个必经阶段
  5. linux 运行python 看不到异常信息_linux python运行报编码错误
  6. 交叉验证和超参数调整:如何优化您的机器学习模型
  7. 12-事件委托(事件代理)
  8. LeetCode 505. 迷宫 II(BFS / Dijkstra 最短路径)
  9. foundation 框架_来自Linux Foundation,DockerCon,Facebook,Google等的开源新闻
  10. mysql数据库的操作dao vo_nutzdao+druid使用非数据库实体VO接收返回的对象一直报“Table ‘xxxxx’ doesn't exist”...
  11. HTML中文字携带拼音的方法
  12. oracle logged on,ORA-01012:not logged on的解决办法
  13. 网站上传服务器浏览器打不开,网站发布或自己上传程序后,网站打不开的原因有哪些?...
  14. Excel - 选择性粘贴和单元格引用规则
  15. 什么是禅?《禅与计算机程序设计艺术》 / 陈光剑
  16. linux系统nginx安装教程,Linux下Nginx安装教程
  17. vue-pdf插件实现pdf文档预览(自动分页预览)——基础积累
  18. 华为荣耀9短接点 | 华为荣耀9拆机短接TP测试点 | 华为荣耀9怎么短接出HUAWEI USB COM 1.0 (COM3)
  19. 自学从零开始的HTML基础课程(day2)
  20. 轻松管理多个织梦网站 织梦CMS多后台快捷登陆软件

热门文章

  1. {转}maven+continuum安装与配置
  2. C#实现文件下载代码
  3. 简单说说通讯设备的热设计
  4. Build Provider 不得不说的事
  5. 关于相机标定的问题答复网友
  6. Alpha 通道的概念与功能
  7. C#中Console.ReadKey()与ConsoleKey的一些用法
  8. C# —— 深入理解委托类型
  9. excel打开2个独立窗口_谢楠称女性独立的不是钱是心 谢楠与吴京婚后生育2个儿子...
  10. vue传中文标点_vue项目引入第三方高德地图实现标点定位