消息中间件RabbltMQ面试题总结(2021持续更新)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了消息中间件RabbltMQ面试题总结(2021持续更新),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7755字,纯文字阅读大概需要12分钟。
内容图文
消息中间件RabbltMQ面试题总结(2021持续更新)
建议新手同学先去学习MQ基础知识,可以看相关网课或文档。再来看面试题总结,这样会加深思路,有时间我会再写一篇RabbitMQ的基础教程以及代码实现思路。
推荐网课:https://www.bilibili.com/video/BV1up4y1i7TN?from=search&seid=10453874956460120695
今年开始会持续输出笔记,面试题总结。主要是JAVA方向和分布式方向。一起加油,一起学习,共同进步。
本文内容来自于个人学习笔记,网络收集整理。转载请标明出处。
RabbitMQ官方地址:http://www.rabbitmq.com/
文章目录
谈谈MQ的优缺点
优点:系统解耦,异步提速,削峰填谷
1.系统解耦:MQ相当于一个中介,让生产者和消费者通过它来进行交互。简单来说就是将两个本来互相影响的系统分离开,降低双方依赖程度,提高系统容错度;
2.异步提速:生产者将业务上不需要同步处理并且耗时长的操作交给消息队列,消息队列通知消费者异步处理。提高系统的响应时间,增加吞吐量;
3.削峰填谷:订单系统或者考试网站的注册系统,总会在短时间内迎来峰值,数据库支持的并发上限不高,这时候就需要消息队列来做限流,先将生产者的请求保存到队列中,再由消费者慢慢消化,这就是削峰,而过了高峰期后,消费者会保持相同的消耗速度来快速消耗掉挤压的消息,这就是填谷。提高系统稳定性。
缺点:系统可用性,系统复杂度,数据一致性
1.系统可用性:系统的可用性委托给了mq,要保证mq的高可用性,mq挂了系统就挂了
2.系统复杂度:同步转为了异步,那就要保证消息不被重复消费,消息不丢失,消息的有序
3.数据一致性:可能存在多个消费者消费同一条消息,可能一条消息被C1,C2消费成功了,但是C3消费失败,这个时候数据的一致性就无法得到保障,以及可能出现的消息幂等性的问题,消息丢失的问题等。
谈谈MQ的应用场景
定时任务(定时订单),顺序消费(消息有一定的前后顺序),请求削峰, 异步通讯。
可以看到大部分应用场景,就是充分发挥MQ的几条优点。
什么情况下可以使用mq呢,首先是生产者不需要消费者的及时反馈,允许短暂的数据不一致性,使用了mq后确实有提升效果并且这些效果的价值超过加入MQ,管理MQ,维护MQ的成本。
什么是RabbitMQ,谈一下他和常见mq的异同
RabbitMQ是基于AMQP协议的消息队列。
用erlangyu语言开发,二次开发成本高,RocketMQ用Java开发,容易实现定制,所以扩展性不如RocketMQ。
社区生态丰富,比RockMQ丰富很多。
吞吐量在万级左右,不如RocketMQ和Kafka的十万级。
消息延迟微秒级,其余都是毫秒级,这是编程语言决定的。
什么是AMQP协议
Broker: 消息队列服务器实体
Exchange: 消息交换机,它指定消息按特定规则,路由到哪个队列
Queue: 消息队列载体,每个消息都会被投入到一个或多个队列
Binding: 绑定,它的作用就是把exchange和queue按照路由规则绑定起来
Routing Key: 路由关键字,exchange根据这个关键字进行消息投递
VHost: vhost 可以理解为虚拟 broker ,即 mini-RabbitMQ server。其内部均含有独立的 queue、exchange 和 binding 等,拥有独立的权限系统,可以做到 vhost 范围的用户控制。
Producer: 消息生产者,
Consumer: 消息消费者
Channel: 消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务
AMQP和JMS的异同。
AMQP是在协议层定义,是通讯协议,规定了数据通讯的格式,不指定实现语言。JMS是JavaAPI。
几种工作模式简介
官网对应模式介绍:https://www.rabbitmq.com/getstarted.html
simple模式 (一对一模式)
1.生产者产生消息,将消息放入队列
2.消费者监听消息队列,队列中有消息,就消费掉,消息被拿走后,自动从队列中删除
work工作模式 (一对多模式,争抢模式)
1.消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2同时监听同一个队列,消息被消费。消费者1,消费者2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息
缺陷:高并发下不能保证消息的有序执行。以及可能会重复消费。
publish/subscribe (发布订阅模式)
1.每个消费者监听自己的队列,通过配置文件绑定好自己的队列;
2.生产者将消息发给消息队列服务器实体 ,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息。
routing (路由模式,routingKey绑定)
1.消息生产者将消息发送给交换机按照路由判断,路由是字符串(业务功能定义路由字符串 ) 当前产生的消息携带路由字符(对象的方法),交换机根据路由的key,只能匹配上路由key对应的消息队列,对应的消费者才能消费消息;
2.从系统的代码逻辑中获取对应的功能字符串,将消息任务扔到对应的队列中。
topic (主题模式,模糊的routing模式)
同上,使用通配符来进行模糊匹配。 # 代表多个多层匹配,*代表一层一个匹配。
如何保证幂等性(重复消费)
消费者未响应ACK,主动关闭频道或者消费者服务挂掉,导致消息在队列中没有去除。重启后可能会重复消费。
幂等性指一次和多次请求某一个资源,对于资源本身应该具有同样的结果。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。在MQ中指,消费多条相同的消息,得到与消费该消息一次相同的结果。
如何保证有序性
这里简单细谈一下顺序消费,实现顺序消费我的几种思路。
一是把顺序的实现交给生产者,mq使用大量的queue存储消息,把那些具有前后关系的一系列消息,通过关键值hash等操作发送到同一个queue中。这样消费者只需要多线程的来读取queue即可,不需要考虑顺序问题。
二是把顺序的实现交给消费者,mq使用同一个queue存储消息,消费者内部使用多个内存queue来散列消息,散列出的多个queue交给不同的线程并发处理。
三是把顺序的实现交给双方,mq用一个queue存储消息,消费者请求消息的时候要争夺一个锁,同一时间只能有一个消费者从mq中读取消息。
//这个地方,我理解的还不到位,只是提供一些思路。后面会单独写一篇文章,结合对比,kafka,mysql等详细谈一下有序性的实现方式。
如何保证高可用
集群。集群保证了可靠性。同时横向拓展提高了吞吐率。
延申问题是如何搭建集群,集群的搭建模式
如何保证可靠性
可靠性也就是消息可以100%被消费
1.exchange要持久化queue要持久化message要持久化
2.生产方确认Confirm;publisher-confirms=“true” 开启 确认模式。保证生产者和mq之间的可靠性
3.消费方确认Ack.ack保证mq和消费者之间的可靠性
4.Broker高可用
死信队列
死信消息:
1.消息被拒绝(Basic.Reject或Basic.Nack)并且设置 requeue 参数的值为 false
2.消息过期了
3.队列达到最大的长度
消息延迟(TTL)
可以配置消息的过期时间和存活时间。有下面两种方法。
设置队列过期时间使用参数:x-message-ttl,单位:ms(毫秒),会对整个队列消息统一过期。
设置消息过期时间使用参数:expiration。单位:ms(毫秒),当该消息在队列头部时(消费时)。
作用于同一条消息时,时间更短的生效
配合死信队列,可以实现延迟队列的功能。RocketMQ本身是没有提供延迟队列功能。
部署模式
使用HAProxy实现负载均衡
普通模式:默认模式,以两个节点(rabbit01,rabbit02)为例来进行说明,对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01,rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer,所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么等到rabbit01节点恢复,然后才可被消费。如果没有消息持久化,就会产生消息丢失的现象。
镜像模式:把需要的队列做成镜像队列,存在与多个节点属于RabibitMQ的HA方案,该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取,该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉,所以在对可靠性要求比较高的场合中适用
节点分为内存节点(保存状态到内存,但持久化的队列和消息还是会保存到磁盘),磁盘节点(保存状态到内存和磁盘),一个集群中至少需要一个磁盘节点
什么是镜像队列
参考https://blog.csdn.net/u013256816/article/details/71097186
不是负载均衡,是实现高可用集群的一种实现方式。数据会被同步到镜像队列。这就涉及到数据的同步。当一台服务器宕机,mq挂掉了,其他的队列就能够起作用了。
消息堆积怎么处理
当生产消息的速度长时间,远远大于消费的速度时,就会造成消息堆积
解决办法
1.排查消费者的消费性能瓶颈
2.增加消费者的多线程处理
3.部署多个消费者
消息积压处理办法:临时紧急扩容,大量增加队列和服务器部署,提高消费者消费速度。
MQ中消息失效:丢弃重导。
MQ消息队列快满了:临时写程序快速处理,实在不行丢弃重导。
如何设计MQ
功能完善,可用性,可靠性,拓展性,可维护性,
未完待续
内容总结
以上是互联网集市为您收集整理的消息中间件RabbltMQ面试题总结(2021持续更新)全部内容,希望文章能够帮你解决消息中间件RabbltMQ面试题总结(2021持续更新)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。