备战面试之RabbitMQ

1、讲一讲你在项目中使用到的消息队列

我在项目中使用消息队列的目的是为了模块之间解耦合,由于我的项目是模块化的,其中一个模块是从硬件设备读数据,还有一个模块是将数据转发给对应的客户端,我使用消息队列作为中间件,将两个模块解耦,前一个模块读到数据后添加到消息队列中,后一个模块从消息队列取消息并转发给客户端,二者不需要得知对方的存在,只需要跟消息队列交互,因此一个模块出现故障对另外一个模块的影响较小。(补充:我这里用到的消息队列是RabbitMQ,数据推送是使用WebSocket实现的,并且我将添加消息以及消费消息的过程进一步封装成一个消息分拣模块,转发模块委托此模块添加消息而不需要知道消息队列的具体类型,此模块也可以委托数据推送模块而不需要知其具体的实现细节)。

2、你在项目中使用到的是消息队列的哪种转发模式(Exchange类型)

直接回答问题3

3、RabbitMQ有哪几种消息转发模式,分别有什么特点(应用场景是什么)

  • Direct模式: 特点是完全匹配路由键,只有当消息发送的routkey完全匹配queue绑定的key时,交换机才能转发消息到该队列,我在项目中用到了这种转发模式,每个硬件的数据添加到指定的消息队列,客户端从指定的消息队列中读消息,三者是绑定在一起的,实现客户端对设备的一对一监控。
  • Fanout模式: 这种模式不处理路由键,在这种模式下交换机无差别的将消息转发给所有绑定在上面的消息队列,我在项目中也使用了这种模式,因为我的项目中可能出现同一个客户端多处登录的情况,我为每个登陆的客户端添加一组消息队列,意味着需要将相同的数据无差别的添加到各组队列中,这时我使用的就是Fanout模式,实现了多对一监控。
  • Topic模式:这种模式的特点是模糊匹配路由键,交换机将消息转发给匹配成功的消息队列中。在一个客户端监视多台设备数据时可以使用这种模式。实现一对多监控。

4、谈一谈RabbitMQ(谈一谈你对AMQP协议的了解)

RabbitMQ是AMQP协议的实现。
AMQ的整体模型一般分为Client和Server两部分,其中客户端可以是发布者(Publisher)也可以是消费者(Consumer),Server也称为Borker,负责将消息经由交换机(Exchange)添加到对应的消息队列(Message Queue)中,以及将队列中的消息从消息队列中取出并发送给消费者(Consumer)。这里牵涉到AMQP协议的几个概念,分别是Server也成为Borker,交换机Exchange,消息队列Message Queue以及消费者Consumer)。
除此之外AMQP协议还有几个十分重要的概念,分别是:

  • Connection:Connection表示客户端和Borker之间建立的一个长连接,我在项目中使用到的AMQ客户端是由spring框架实现的,它使用TCP/IP协议创建连接。
  • Channel:基本上客户端对Borker的读写操作都是通过Channel完成的,一个Connection可以包含多个Channel,各Channel之间是相互独立的,因此在多线程情况下可以采取每个线程开启一个信道的编程模型。例如可以开启专门的线程和信道用于检测心跳,判断连接是否断开。

5、RabbitMQ如何解决服务器异常崩溃导致消息丢失的问题(谈一谈消息确认机制)

RabbitMQ通过消息持久化到主机上来解决服务器异常崩溃导致的消息丢失问题,除此之外我们还会面临一个问题,就是网络连接异常断开,在客户端和服务器之间正在传输的消息丢失问题改如何解决,RabbitMQ采用两种方式,分别是事务机制以及消息确认机制,在这里我谈一谈RabbitMQ的消息确认机制。
消息确认机制的大致流程是发送端在发出消息之后,需要等待接收端的确认,来知晓消息是否发送成功,RabbitMQ中的消息确认发生在Publisher发送消息以及Consumer消费消息的时候,消息从Publisher发送到Broker成功会返回一个Ack,失败则返回Nack,消息从Exchange添加到Message Queue是否成功也会返回消息确认。在消费消息的时候,消费者接收到消息并处理完成后会发送一个Ack给Broker,Broker才会把这条消息删除,如果没有接收到消息,可以选择让消息在队列中重新排队或者直接丢弃该消息。

全部评论

相关推荐

07-07 12:25
门头沟学院 Java
程序员牛肉:你这个智邮公司做的就是那个乐山市税务系统的服务吗?
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-25 18:29
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务