Day10_12_消息队列之RabbitMQ面试题

Day10_12_消息队列之RabbitMQ⾯试题
RabbitMQ⾯试题
1. rabbitmq 的使⽤场景有哪些?
①. 跨系统的异步通信: 所有需要异步交互的地⽅都可以使⽤消息队列.
②. 多个应⽤之间的解耦: 由于消息队列是平台⽆关和语⾔⽆关的,⽽且语义上也不再是函数调⽤,因此适合作为多个应⽤之间的松耦合的
接⼝.
③. 应⽤内的同步变异步: ⽐如订单处理,就可以由前端应⽤将订单信息放到队列,后端应⽤从队列⾥依次获得消息处理,⾼峰时的⼤量订单
可以积压在队列⾥慢慢处理掉.
④. 消息驱动的架构(EDA): 系统分解为消息队列,消息制造者和消息消费者,⼀个处理流程可以根据需要拆成多个阶段,阶段之间⽤队列连
接起来,前⼀个阶段处理的结果放⼊队列,后⼀个阶段从队列中获取消息继续处理.
⑤. 跨局域⽹甚⾄跨城市的通讯: ⽐如北京机房与⼴州机房的应⽤程序的通信.
2. rabbitmq 有哪些重要的⾓⾊?
扎带
⽣产者: 消息的创建者,负责创建和推送数据到消息服务器;
消费者: 消息的接收⽅,⽤于处理数据和确认消息;
代理: 就是 RabbitMQ 本⾝,⽤于扮演“快递”的⾓⾊,本⾝不⽣产消息,只是扮演“快递”的⾓⾊.
3. rabbitmq 有哪些重要的组件?
ConnectionFactory(连接管理器): 应⽤程序与Rabbit之间建⽴连接的管理器,程序代码中使⽤.
灭火器标签
Channel(信道): 消息推送使⽤的通道.
Exchange(交换器): ⽤于接受、分配消息.
Queue(队列): ⽤于存储⽣产者的消息.
RoutingKey(路由键): ⽤于把⽣产者的消息分配到交换器上.
BindingKey(绑定键): ⽤于把交换器的消息绑定到队列上.
4. rabbitmq 中 vhost 的作⽤是什么?
vhost 可以理解为虚拟 broker,即 mini-RabbitMQ server.其内部均含有独⽴的 queue、exchange 和 binding 等.但最最重要的是,其拥有独⽴的权限系统,可以做到 vhost 范围的⽤户控制.当然,从 RabbitMQ 的全局⾓度,vhost 可以作为不同权限隔离的⼿段(⼀个典型的例⼦就是不同的应⽤可以跑在不同的 vhost 中).
5. rabbitmq 的消息是怎么发送的?
⾸先客户端必须连接到 RabbitMQ 服务器才能发布和消费消息,客户端和 rabbit server 之间会创建⼀个 tcp 连接,⼀旦 tcp 打开并通过了认证(认证就是你发送给 rabbit 服务器的⽤户名和密码),你的客户端和 RabbitMQ 就创建了⼀条 amqp 信道(channel),信道是创建在“真实” tcp 上的虚拟连接,amqp 命令都是通过信道发送出去的,每个信道都会有⼀个唯⼀的 id,不论是发布消息,订阅队列都是通过这个信道完成的.
6. rabbitmq 怎么保证消息的稳定性?
消息事务;
消息确认机制.
7. rabbitmq 怎么避免消息丢失?
消息持久化;
ACK确认机制;
设置集镜像模式;
消息补偿机制.
8. 要保证消息持久化成功的条件有哪些?
声明队列必须设置持久化 durable 设置为 true.
消息推送投递模式必须设置持久化,deliveryMode 设置为 2(持久);
消息已经到达持久化交换器;
消息已经到达持久化队列.
以上四个条件都满⾜才能保证消息持久化成功。
9. rabbitmq 持久化有什么缺点?
持久化的缺地就是降低了服务器的吞吐量,因为使⽤的是磁盘⽽⾮内存存储,从⽽降低了吞吐量,可尽量使⽤ ssd 硬盘来缓解吞吐量的问题.
10. rabbitmq 有⼏种⼴播类型?
fanout: 所有bind到此exchange的queue都可以接收消息(纯⼴播,绑定到RabbitMQ的接受者都能收到消息);
direct: 通过routingKey和exchange决定的那个唯⼀的queue可以接收消息;
topic: 所有符合routingKey(此时可以是⼀个表达式)的routingKey所bind的queue可以接收消息;
headers:
11. rabbitmq 怎么实现延迟消息队列?
通过消息过期后进⼊死信交换器,再由交换器转发到延迟消费队列,实现延迟功能;
使⽤ RabbitMQ-delayed-message-exchange 插件实现延迟功能.
12. rabbitmq 集有什么⽤?
⾼可⽤: 某个服务器出现问题,整个 RabbitMQ 还可以继续使⽤;
⾼容量: 集可以承载更多的消息量.
13. rabbitmq 节点的类型有哪些?
磁盘节点: 消息会存储到磁盘.
电动卷帘门控制器内存节点: 消息都存储在内存中,重启服务器消息丢失,性能⾼于磁盘类型.
14. rabbitmq 集搭建需要注意哪些问题?
各节点之间使⽤“--link”连接,此属性不能忽略;
各节点使⽤的 erlang cookie 值必须相同,此值相当于“秘钥”的功能,⽤于各节点的认证.
整个集中必须包含⼀个磁盘节点.
15. rabbitmq 每个节点是其他节点的完整拷贝吗? 为什么?
不是,原因有以下两个:
存储空间的考虑: 如果每个节点都拥有所有队列的完全拷贝,这样新增节点不但没有新增存储空间,反⽽增加了更多的冗余数据;
性能的考虑: 如果每条消息都需要完整拷贝到每⼀个集节点,那新增节点并没有提升处理消息的能⼒,最多是保持和单节点相同的性能甚⾄是更糟.
便携式洒弹器16. rabbitmq 集中唯⼀⼀个磁盘节点崩溃了会发⽣什么情况?
如果唯⼀磁盘的磁盘节点崩溃了,则不能进⾏以下操作:
不能创建队列;
不能创建交换器;
不能创建绑定;
不能添加⽤户;
不能更改权限;
不能添加和删除集节点;
唯⼀磁盘节点崩溃了,集是可以保持运⾏的,但你不能更改任何东西.
17. rabbitmq 对集节点停⽌顺序有要求吗?
RabbitMQ 对集的停⽌的顺序是有要求的,应该先关闭内存节点,最后再关闭磁盘节点.如果顺序恰好相反的话,可能会造成消息的丢失. 18. RabbitMQ 上的⼀个 queue 中存放的 message 是否有数量限制?
可以认为是⽆限制,因为限制取决于机器的内存,但是消息过多会导致处理效率的下降.
19. 客户端连接到 cluster 中的任意 node 上是否都能正常⼯作?
是的.客户端感觉不到有何不同.
20. 向不存在的 exchange 发 publish 消息会发⽣什么?向不存在的 queue 执⾏ consume 动作会发⽣
什么?
pet打包带生产线
都会收到 Channel.Close 信令告之不存在(内含原因 404 NOT_FOUND).
21. routing_key 和 binding_key 的最⼤长度是多少?
255 字节.
22. RabbitMQ 允许发送的 message 最⼤可达多⼤?
根据 AMQP 协议规定,消息体的⼤⼩由 64-bit 的值来指定,所以你就可以知道到底能发多⼤的数据了.
23. “dead letter”queue 死信队列的⽤途?
当消息被 RabbitMQ server 投递到 consumer 后,但 consumer 却通过 Basic.Reject 进⾏了拒绝时(同时设置 requeue=false),那么该消息会被放⼊“dead letter”queue 中.该 queue 可⽤于排查 message 被 reject 或 undeliver 的原因.
24. 为什么使⽤消息队列
其实就是问问你消息队列都有哪些使⽤场景,然后你项⽬⾥具体是什么场景,说说你在这个场景⾥⽤消息队列是什么?
⾯试官问你这个问题,期望的⼀个回答是说,你们公司有个什么业务场景,这个业务场景有个什么技术挑战,如果不⽤ MQ 可能会很⿇烦,但是你现在⽤了 MQ 之后带给了你很多的好处.
说⼀下消息队列常见的使⽤场景,⽐较核⼼的有 3 个: 解耦、异步、削峰.
25. 常见mq队列及区别
常见的mq队列有ActiveMQ、RabbitMQ、RocketMQ、Kafka,区别可见图:
26. 如何保证mq数据不丢失?
1  .⽣产者和mq队列之前传输要使⽤确认机制,⽣产者发送消息给mq丢列后,mq要进⾏接⼝回调告诉⽣产者这个数据我已经收到了.如
果发送失败⽣产者要有重试机制进⾏重新发送.
2  .mq队列要进⾏数据的持久化,保证mq挂掉后数据不会丢失.或者保持mq队列的⾼可⽤性,防⽌mq宕机造成数据丢失.
3  .消费者和mq队列之间也要加⼊确认机制,待消费者处理完具体的业务后,注意是处理完业务逻辑后,再回调mq,告诉mq我已经处理完
了.
27. 如何保证mq幂等性?
保证幂等性的意思就是保证数据不被消费者重复消费,不在在数据库中插⼊重复的数据,要解决这个问题就要在消费者端⼊⼿.
1  .进⾏数据库操作的时候,可以先查下这个数据是否已经存在了,如果存在了进⾏更新操作,不存在就进⾏插⼊操作;
2  .写⼊redis:这个⽐较简单,直接利⽤redis的set数据类型就可以保证数据不会重复了;
3  .如果不是数据库业务情景的话,如直接根据得到的数据进⾏发送邮件或者短信.这种情况的话可以加⼀个redis的set数据类型进⾏消
重处理,或者⽤数据库做⼀个发送的⽇志记录,⽤1  的⽅式去处理.
28. 如何实现mq⾼可⽤?
每种mq都有实现⾼可⽤性的⽅式,activeMQ和rabbitMQ是通过主从集的⽅式实现⾼可⽤性的,但是存在⼀个致命问题就是,当mq队列爆满的时候,主从架构不能横向扩容,因为每个queue保持的数据都是⼀样的.
下⾯主要介绍下分布式架构的kafka.
1  . kafka的⼀个topic的数据分布在分区(partition)中,⽽每个partition都分布在不同的broker中,这样就保证了同⼀个topic的数据分
布在不同的机器中;
液压滑环2  . kafka每个partition都有⼀个leader和多个follower,当leader挂了,follower会⾃动选举出来⼀个leader,这样就保证了mq的健壮
性;
3  . ⽣产者和消费者的读写只能通过leader进⾏,不能读写follower,同时只有当leader的数据同步给follower之后才认为是写成功了,保
证数据不丢失.
可以看到,相⽐主从架构,分布式架构具有更⾼的可扩展性,可⽤横向增加partition进⾏扩容.
29. 如何保证消息队列的⾼可⽤?
RabbitMQ 的⾼可⽤性
RabbitMQ 是⽐较有代表性的,因为是基于主从(⾮分布式)做⾼可⽤性的,我们就以 RabbitMQ 为例⼦讲解第⼀种 MQ 的⾼可⽤性怎么实现. RabbitMQ 有三种模式: 单机模式、普通集模式、镜像集模式.
单机模式
单机模式,就是 Demo 级别的,⼀般就是你本地启动了玩玩⼉的,没⼈⽣产环境⽤单机模式.
普通集模式(⽆⾼可⽤性)

本文发布于:2024-09-22 18:22:07,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/267016.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:消息   队列   节点   数据   处理   集群   不能   模式
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议