消息中间件之RabbitMQ专题之五:RabbitMQ的面试题

1、什么是RabbitMQ?为什么使用RabbitMQ?

RabbitMQ是一款开源的,Erlang编写的,基于AMQP协议的,消息中间件;
可以用它来:解耦、异步、削峰。

2、RabbitMQ有什么优缺点?

优点:解耦、异步、削峰;

缺点:降低了系统的稳定性:本来系统运行好好的,现在你非要加入个消息队列进去,那消息队列挂了,你的系统不是呵呵了。因此,系统可用性会降低;
增加了系统的复杂性:加入了消息队列,要多考虑很多方面的问题,比如:一致性问题、如何保证消息不被重复消费、如何保证消息可靠性传输等。因此,需要考虑的东西更多,复杂性增大。

3、如何保证RabbitMQ的高可用?

搭建RabbitMQ集群;rabbitmq 的集群分两种模式 一种是默认模式 一种是镜像模式;
在rabbitmq集群当中 所有的节点(一个rabbitmq服务器) 会被归为两类 :一类是磁盘节点disk node; 一类是内存节点RAM node。

默认模式会把所有节点的交换机信息 和队列的元数据(队列数据分为两种 一种为队列里面的消息, 另外一种是队列本身的信息 比如队列的最大容量,队列的名称,等等配置信息, 后者称之为元数据) 进行复制 确保所有节点都有一份。

镜像模式,则是把所有的队列数据完全同步(当然 对性能肯定会有一定影响) 当对数据可靠性要求高时 可以使用镜像模式

4、RAM node 和 disk node 的区别?

磁盘节点会把集群的所有信息(比如交换机,队列等信息)持久化到磁盘当中,而内存节点只会将这些信息保存到内存当中 讲白了 重启一遍就没了。
为了可用性考虑 rabbitmq官方强调集群环境至少需要有一个磁盘节点, 而且为了高可用的话, 必须至少要有2个磁盘节点, 因为如果只有一个磁盘节点 而刚好这唯一的磁盘节点宕机了的话, 集群虽然还是可以运作, 但是不能对集群进行任何的修改操作(比如 队列添加,交换机添加,增加/移除 新的节点等)。

5、RabbitMQ 上的一个 queue 中存放的 message 是否有数量限制?

可以认为是无限制,因为限制取决于机器的内存,但是消息过多会导致处理效率的下降。

6、如何保证RabbitMQ不被重复消费?

先说为什么会重复消费:正常情况下,消费者在消费消息的时候,消费完毕后,会发送一个确认消息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除;

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

针对以上问题,一个解决思路是:保证消息的唯一性,就算是多次传输,不要让消息的多次消费带来影响;保证消息等幂性;

比如:在写入消息队列的数据做唯一标示,消费消息时,根据唯一标识判断是否消费过;

7、如何保证RabbitMQ消息的可靠传输?

消息不可靠的情况可能是消息丢失,劫持等原因;
丢失又分为:生产者丢失消息、消息列表丢失消息、消费者丢失消息;

生产者丢失消息:RabbitMQ提供transaction和confirm模式、ReturnCallback失败回调来确保生产者不丢消息;使用transaction会降低性能,吞吐量下降,不推荐使用。

消费者丢失消息:消费者丢数据一般是因为采用了自动确认消息模式,改为手动确认消息即可!
消费者在收到消息之后,处理消息之前,会自动回复RabbitMQ已收到消息;如果这时处理消息失败,就会丢失该消息;
解决方案:处理消息成功后,手动回复确认消息。

8、如何保证RabbitMQ消息的顺序性?

单线程消费保证消息的顺序性;对消息进行编号,消费者处理消息是根据编号处理消息;

9、客户端连接到 cluster 中的任意 node 上是否都能正常工作?

是的。客户端感觉不到有何不同。

10、routing_key 和 binding_key 的最大长度是多少?

255 字节。

11、什么是消息预取

什么是消息预取? 讲白了以前是rabbitmq一股脑吧所有消息都均发给所有的消费者(不管你受不受得了),而现在是在我消费者消费之前 先告诉rabbitmq。 我一次能消费多少数据 等我消费完了之后告诉rabbitmq ,rabbitmq再给我发送数据;在使用消息预取前 要注意一定要设置为手动确认消息。
消息预取值的范围为:1-2500;

12、什么是死信交换机

死信交换机有什么用呢? 在创建队列的时候 可以给这个队列附带一个交换机, 那么这个队列作废的消息就会被重新发到附带的交换机,然后让这个交换机重新路由这条消息。
三种消息会进入死信交换机:
1)被拒绝又没有退回到原队列当中,可以退出到死信交换机中;
2)当消息过期的时候;
3)当消息超过了队列长度容量时。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值