java面试:有了解过消息队列RabbitMq吗?详细说一说

java面试:有了解过消息队列RabbitMq吗?详细说一说

RabbitMq与RocketMq和kafka类似,都是消息队列的一类,相同的它们都是作为java当中的常见考点,来考察面试者对mq消息队列的实习程度,上两期我们讲解了RocketMq和kafka的底层原理,今天我们就对RabbitMq的知识进行一个分享,希望大家有所收获。

1.RabbitMq的整体结构

     与其他消息队列类似,一个RabbitMq包含发送消息的生产者,负责去拉取接受生产者信息持久化到磁盘,以及拉取消费者拉取请求的broker,以及消费信息的消费者。

2.RabbitMq的交换机  

     RabbitMq为了保证消息的灵活性于是设计了交换机,交换机通过bindingkey来和队列绑定,然后通过这个绑定将对应的消息转发到相应的队列,然后让消费者去监听获取消息。

     交换机一共被分为四类:

     1.fanout交换机:

     通过广播的方式将消息路由到交换机绑定的所有队列当中

  2.direct交换机:

   根据发消息的Routingkey把消息路由到对应相同的bindingkey绑定的队列里面,属于点对点的模式。

3.topic交换机

 根据发消息的Routingkey把消息路由到对应的bindingkey绑定的队列里面,但是加入绑定了通配符,所以会更加灵活。

4.header交换机

不依赖bindingkey的匹配规则,通过消息里的headers进行匹配

3.RabbitMq的高可用

     RabbitMq只部署一个节点,就会出现单点故障的问题,要保证一个高可用就必须要上集群,通过多节点来避免单机的单节点故障问题。

     而RabbitMq支持两种集群的方式,一种是普通集群而另一种是镜像集群

     普通集群在这个模式下,队列里的元数据会给所有集群的节点去同步,但是事实上队列上的数据只在队列本身当中存在,而其他的队列仅仅是持有指向队列的元数据,这虽然节省了数据的存储空间,但是却无法达到真正的高可用,因为只要节点故障了,其他队列就获取不到这个节点的数据,单点故障的问题依旧会产生。

     在镜像集群当中,每个RabbitMq的节点都会有这个队列的完整镜像,这样的一个集群,就是部署了一个主节点,再部署多个镜像节点,由主节点去读写,然后主节点同步给镜像节点,这和kafka的多副本机制十分相似。

      除此之外,假设一个节点存储不了全量数据,但是RabitMq它并不支持原生的数据分片的能力,没有办法把数据分布到不同的节点上,但是官方提供了一种插件叫rabbit_sharding,这引入了一个分片交换机的概念,当创建一个分片逻辑队列的时候,这个插件就创建了多个物理的分片队列,把路由消息路由到不同节点的分片队列上,这样数据就分布到不同的队列上了,队列再分布到不同的节点上,实现了一个数据的分片策略,假设一个节点存储不了全量数据也可以让每个节点保存部分数据然后通过负载均衡算法,让请求路由到对应的节点。

4.RabbitMq的工作方式

     RabbitMq通过创建好对应的队列,交换机,之后由生产者和RabbitMq的broker建立一个连接,将消息和routingkey发送给指定的交换机,交换机根据自身的类型和对应的规则去匹配routingkey和bindingkey,然后把消息路由到对应的队列当中,之后持久化保存到磁盘当中,而消费者和broker去创建连接然后订阅队列,然后去获取队列里的消息。

今天的分享就到这里了,希望这篇博客能给你一些帮助,让你对关于RabbittMq架构的问题得到进一步的提升,在面试的时候能从容面对面试官。

转载请说明出处内容投诉
CSS教程网 » java面试:有了解过消息队列RabbitMq吗?详细说一说

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买