__没有最好的 只有适合的面试
前言
RabbitMQ是MQ中的一个优秀表明,它凭借本身的可靠性、低延迟等特性在众多MQ实现中占有一席之地,也是面试中常问的MQ。markdown
如何搭建RabbitMQ高可用模式?
RabbitMQ有三种模式:单机模式、普通集群模式、镜像集群模式
单机和普通集群都不能实现高可用!
单机模式不用赘述。
普通集群模式也不存在高可用性,该模式下虽然启动多个RabbitMQ实例,但每一个queue仍然只会放到一个RabbitMQ实例中,若是消费者从B消费,但消费的是A的queue,那B须要从A拉取消息,若是A挂了就没法消费了。性能
RabbitMQ镜像集群模式spa
镜像模式包含一个master和多个slave,分布在不一样的节点上。除了publish外全部动做都只会向master发送,master将命令执行的结果广播给slave,slave会准确地按照master执行命令的顺序进行执行,因此队列的消费操做都是在master上完成的,但消息都同步保存在全部节点上。
若是master挂了,生产者发送的消息还保存在其余的slave上,此时将一个slave提高为master就又能够消费消息了!操作系统
RabbitMQ如何保证不丢数据?
上篇文章讲了从三个方面来防范丢失数据:生产端、队列自己、消费端 👍插件
- 生产端:开启事务(不推荐,太耗性能下降吞吐),推荐开启confirm模式,在生产者那里设置开启confirm模式以后,你每次写的消息都会分配一个惟一的id,写入了RabbitMQ后,RabbitMQ会给你回传一个ack消息,说明消息发送成功了。若是RabbitMQ没能处理这个消息,会返回一个nack消息,告诉你这个消息接收失败。
- 队列自己:开启RabbitMQ的持久化,消息写入以后会持久化到磁盘,就算机器挂了,也能恢复。
- 消费端:经过手动comfirm机制确认消息已经被正确消费了。
怎么设置RabbitMQ持久化?3d
- 建立queue的时候将其设置为持久化,这样就能够保证RabbitMQ持久化queue的元数据,可是它是不会持久化queue里的数据的。
- 发送消息的时候将消息的deliveryMode设置为2,将消息也设置为持久化。
RabbitMQ有哪些组件、分别有什么做用?
- ConnectionFactory(链接管理器):应用程序与RabbitMQ之间创建链接的管理器。
- Channel(信道):消息推送使用的通道, Channel是建立在“真实”TCP上的虚拟链接,AMQP命令都是经过Channel发送出去的,每一个信道都会有一个惟一的ID,不管是发布消息,订阅队列或者接收消息都是经过Channel完成的。
- Exchange(交换器):用于转发消息,生产者的消息会首先进入Exchange, Exchange根据消息的RoutingKey查询路由表(BindingKey表),把消息发送到合适的Queue中。
经常使用的Exchange有三种:code
- fanout:若是交换器收到消息,将会广播到全部绑定的队列上。
- direct:若是RoutingKey彻底匹配,消息就被投递到相应的队列。
- topic:可使来自不一样源头的消息可以到达同一个队列。只要RoutingKey匹配路由表(BindingKey表)就能够转发, 使用topic交换器时,还可使用通配符进行匹配。
- Queue(队列):用于存储生产者的消息。
- RoutingKey(路由键):生产者的消息根据RoutingKey分配到不一样的Queue中。
- BindingKey(绑定键):用于创建Exchange与Queue的链接(绑定关系),Exchange会创建一个绑定信息的查询表,用于路由消息到不一样的Queue中。
- VHost:虚拟主机,严格来讲它不是组件只是一个概念,一个broker( RabbitMQ实例)里能够设置多个vhost,用做不一样用户的权限分离。
RabbitMQ为何使用Channel而不直接使用TCP发送命令?
考虑到TCP建立和销毁是很是昂贵的开销,并且操做系统每秒能建立的TCP也是有限的,业务高峰期将建立大量的链接,严重浪费资源,并且可能会遇到系统瓶颈。
若是咱们每一个请求都使用一条TCP链接,既知足了性能的须要,又能确保每一个链接的私密性,完美👍。orm
RabbitMQ如何实现延迟消息队列?
- 经过消息过时后进入死信交换器,再由交换器转发到延迟消费队列,实现延迟功能。
- 使用RabbitMQ-delayed-message-exchange插件实现延迟功能。
RabbitMQ是push模式仍是pull模式
RabbitMQ两种模式都支持,可是主要使用的仍是push模式,经过channel.basicConsume(QUEUE_NAME, false, consumer)
完成消息的消费,push模式为RabbitMQ主动推给消费者进行消费,主动避免了消息的积压。
pull模式可使用channel.basicGet(QUEUE_NAME, false)
来获取消息,主要用于批量拉取消息的时候使用。队列
回见!