Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day34】—— 消息队列2

本文提供了一份全面的Java开发学习资料,包括基础至进阶课程,以及面试高频问题解答,涉及MQ消息处理、幂等性、顺序性等内容,助力程序员提升技能和面试竞争力。
摘要由CSDN通过智能技术生成

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

贵州 苗寨 夜景


车票

  • 面试题1:我们知道MQ有可能发生重复消费,啥导致的?

    • 追问1:如何保证消息不被重复消费?如何实现幂等性?
  • 面试题2:RabbitMQ如何保证消息的顺序性

  • 面试题3:消息队列满了以后该怎么处理?比如现在大量消息在MQ里长时间积压,你会如何解决?

    • 追问1:MQ消息过期失效怎么办?
  • 追问3:如果mq经常写满你会怎么办?

  • 每日小结


本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识集合容器并发编程JVMSpring全家桶MyBatis等ORMapping框架MySQL数据库Redis缓存RabbitMQ消息队列Linux操作技巧等。

面试题1:我们知道MQ有可能发生重复消费,啥导致的?

=========================================================================================

在一般网络环境下,都存在一定的网络延迟、网络抖动,网络问题导致消息重复发送的情况是难以避免的,毕竟网络环境无法预知,因此MQ默认允许消息重复发送。是的,只要通过网络交换数据,就无法避免这个问题。秉承着打不过就加入的原则,解决这个问题的办法就是绕过这个问题。

那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理?

RabbitMQ、RocketMQ、Kafka,都有可能会出现消息重复消费的问题。因为这问题通常不是 MQ 自己保证的,而是消费方自己来保证的

比如说Kafka, 他实际上有个 offset 的概念(偏移量),就是每个消息写进去,都有一个 offset,代表消息的序号,然后 consumer 消费了数据之后,每隔一段时间(定时定期),会把自己消费过的消息的 offset 提交一下。代表我已经消费过了,就算消费者重启,Kafka也会让消费者继上次消费到的offset继续消费

场景示例:

kafka 中有一条数据:AB,kafka给这条数据分一个 offset(偏移量),offset为: 10011002。消费者从 kafka 去消费的时候,也是按照这个顺序去消费。当消费者消费到 offset=1002 的这条数据(此时offset=1001还没消费完),刚提交 offset=1002 到 zookeeper,消费者进程就被重启了。此时消费过的数据 A 的 offset 还没有提交,kafka 也就不知道消费者已经消费了1001这条数据。那么重启之后,消费者会找 Kafka 把上次消费到的那个地方后面的数据继续传递过来。数据 A 再次被消费。

在这里插入图片描述

如果消费者是拿到一条数据就往数据库里写一条,就会导致把数据 A 在数据库里插入了 2 次,导致数据不一致。重复消费其实并不可怕,可怕的是你没考虑到重复消费时,怎么保证幂等性

追问1:如何保证消息不被重复消费?如何实现幂等性?


幂等性,比如一个数据或者一个请求,给后台重复发多次,针对这类情况,你得确保对应的数据结果是不会改变的,不能因为发了多个相同请求导致数据出错。

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

  • 比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了,你就别插入了,update就行。对了,ES的插入接口是不是就采用了插入并更新的策略?发现相同的数据就直接更新他。

  • 如果是写 Redis,那没问题,反正每次都是set,天然幂等性

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

  • 比如基于数据库的唯一键来保证重复数据不会重复插入多条。因为有唯一键约束了,重复数据插入只会报错,不会导致数据库中出现脏数据。(类似于第一条,可以通过修改SQL,转成插入或更新的策略)

MySQL中的插入或替换插入或更新插入或忽略策略,详情可参考《MySQL中特别实用的几种SQL语句送给大家》


在这里插入图片描述

课间休息,看看 广州 城中村一角


面试题2:RabbitMQ如何保证消息的顺序性

======================================================================================

消息队列中的若干消息如果是对同一个数据进行操作,这些操作又具有先后关系,必须按顺序执行,否则可能会造成数据错误。

比如有三个请求,是对数据库中的同一条数据进行了插入->更新->删除操作,执行顺序必须保证,如果变成删除->更新->插入就很可笑了,造成最终数据不一致

顺序错乱的场景:

一个queue,有多个consumer去消费,这样就会造成顺序的错误,consumer从MQ里面读取数据是有序的,但是每个consumer的执行时间是不固定的,无法保证先读到消息的consumer一定先执行完操作,这样就会出现消息并没有按照顺序执行,造成数据顺序错误。

rabbitmq如何保证消息的消费顺序

将原来的一个queue拆分成多个queue,每个queue都有一个自己的consumer。该种方案的核心是生产者在投递消息的时候根据业务数据关键值(例如订单ID哈希值对订单队列数取模)来将需要保证先后顺序的同一类数据(同一个订单的数据) 发送到同一个queue当中,让同一个consumer来按顺序处理

在这里插入图片描述

图片取自中华石杉架构课件

一个queue就一个consumer,在consumer中维护多个内存队列,根据业务数据关键值(例如订单ID哈希值对内存队列数取模)将消息加入到不同的内存队列中,然后多个真正负责处理消息的线程去各自对应的内存队列当中获取消息进行消费。

在这里插入图片描述

写在最后

作为一名即将求职的程序员,面对一个可能跟近些年非常不同的 2019 年,你的就业机会和风口会出现在哪里?在这种新环境下,工作应该选择大厂还是小公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动?

就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验Java程序员的技术功底。

最近我整理了一份复习用的面试题及面试高频的考点题及技术点梳理成一份“Java经典面试问题(含答案解析).pdf和一份网上搜集的“Java程序员面试笔试真题库.pdf”(实际上比预期多花了不少精力),包含分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货!

由于篇幅有限,为了方便大家观看,这里以图片的形式给大家展示部分的目录和答案截图!

Java经典面试问题(含答案解析)

阿里巴巴技术笔试心得

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
研究,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-MbequQ6b-1713547173766)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值