rabbitmq 面试必知必会
背景
rabbitmq是erlang语言编写,通过AMQP协议通信,开源且并发量高,是各大公司常用到的消息队列组价之一,当然也是面试过程中会问到相关问题,先列出几道经常会被问到的面试题,看看你能答对几个
更多资料获取
文章内容有限,更多rabbitmq相关资料获取如下
链接: https://pan.baidu.com/s/1BVMwaQMYzu2TFQWwgqa38w
提取码: spd8
提取码过期请关注公众号回复shell重新获取:*
常见面试题
rabbitmq有什么特点?
- 可靠性:rabbitmq内部有一些机制可以保证可靠性,如消息和队列持久化,消息的发布确认、传输确认等
- 支持多种协议:rabbitmq除了支持AMQP协议外,还支持MQTT等消息中间件协议。
- 高可用性: 队列可以在多台机器中设置镜像,一般设置成2,一台机器挂了,另一台机器上的队列提供服务。
- 灵活的路由功能:消息进入到队列前是经过交换机进行路由到队列的,rabbitmq内置一些简单的交换机,对于复杂的路由功能可通过多个交换机绑定来实现,当然也可以通过插件来实现。
- 多种语言客户端:rabbitmq几乎支持所有语言客户端,包括不限于java、python、go等。
- 人性化的管理节点:rabbitmq提供了容易使用的管理界面,可以在界面上进行监控和管理消息,管理集群节点等。
- 可扩展性:可根据需要轻松扩展集群节点。
为什么需要消息队列?
随着业务规模的扩张,很多应用日活几千万,之前的单体架构也逐步演进到目前的微服务架构,大量的微服务之间耦合严重。主要是为了解决微服务高并发场景下耦合严重、通信问题、大流量问题。
服务解耦、异步通信、流量削峰。
解释下AMQP是什么以及其组成?
AMQP协议是rabbitmq底层实现,所以两者的模型框架是相似的,都是消息发送给交换机,然后交换机绑定队列。
AMQP协议分为三层:
- transport layer:最底层,主要用于传输二进制数据流。
- session layer: 中间层,主要是将客户端消息发送给服务器,然后服务器返回应答消息给客户端,保证消息的可靠性。
- module layer: 最高层,定义了一些客户端可调用的函数。
AMQP协议中的三大组件:
- 交换机(exchange):主要用于将消息路由给相应队列。
- 队列(queue):主要用于存储消息,消息可存放在内存或者硬盘中。
- 绑定(binding):主要时告知交换机将消息路由到那些队列。
消息队列有啥优缺点?
- 优点:解耦、异步、削峰
- 缺点:
系统引入更多外部依赖,一旦mq挂掉,整个系统将不可用。
系统复杂度提高了,如何保证消息不被重复消费以及如何处理消息丢失问题等
如何保证消息传递的顺序性和数据的一致性问题一大堆。
如何保证消息传递过程中的可靠性?
消息可靠性主要体现在以下几个节点,并且有了对应的处理手段
- 生产者到rabbitmq之间:主要是通过事务或者confirm机制确保可靠性,这两种方式互斥。
- rabbitmq本身:可以采取持久化将交换机和队列保存到磁盘中,多节点集群、镜像模式等
- rabbitmq到消费者:可以通过basicack机制,死信队列、消息补偿等措施保证可靠性。
交换机无法将消息发送给队列将如何处理?
查看medatory的值,如果为true,则返回消息给生产者,如果是false,则丢弃。
什么是死信队列,导致死信的原因有哪些?
死信队列:DLQ,主要是因为在队列中信息超过指定时间未被消费,就会重新发送给另一台交换机(死信交换机),然后这台交换机将这条消息路由到死信队列中。绑定死信交换机的队列就是私信队列。
导致死信的原因有三:
- 消息的TTL时间过期
- 队列满了
- 消息被拒绝了
更多内容和资料请关注公众号;数据工匠大壮