rabbit原理以及集群总结

目录

1. 什么是AMQP

2. 消息队列的作用与使用场景

3. 多个消费者监听一个队列时,消息如何分发?

4. RabbitMQ如何实现延时队列?

5. 无法被路由的消息去了哪里?

6. 消息基于什么传输?

7. 消息幂等性怎么实现?

8. 如何确认消息不丢失?

9. Exchange是什么?

10. 什么是Binding?

11. 通信过程?

12. rabbitMq、activeMq、rocketMq、kafka对比分析


1. 什么是AMQP

  AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

 

2. 消息队列的作用与使用场景

  1)异步:批量数据异步处理(批量上传文件)

  2)削峰:高负载任务负载均衡(电商秒杀抢购)

  3)解耦:多个系统之间可以使用MQ进行通信,不再需要使用注入service方法,并点它的接口这种方法。

  4)广播:基于Pub/Sub实现一对多通信

 

3. 多个消费者监听一个队列时,消息如何分发?

  1)轮询:默认的策略,消费者轮流,平均地接收消息

  2)公平分发:根据消费者的能力来分发消息,给空闲的消费者发送更多消息

 

4. RabbitMQ如何实现延时队列?

  利用TTL(队列的消息存活时间或者消息存活时间)

 

5. 无法被路由的消息去了哪里?

  无设置的情况下:无法路由(Routing key错误)的消息会被直接丢弃;

  有设置时:将mandatory设置为true,并配合ReturnListener,实现消息的回发

 

6. 消息基于什么传输?

  :RabbitMQ使用信道的方式来传输数据。信道是建立在真实的TCP连接内的虚拟连接,且每条TCP连接上的信道数量没有限制。

 

7. 消息幂等性怎么实现?

  生产者方面:可以对每条消息生成一个msgID,以控制消息重复投递

  消费者方面:消费者可以根据业务ID去重,避免重复消费

 

8. 如何确认消息不丢失?

  队列持久化;RabbitMQ确保持久性消息能从服务器重启中恢复的方式是,将它们写入磁盘上的一个持久化日志文件,当发布一条持久性消息到持久交换器上时,Rabbit会在消息提交到日志文件后才发送响应。一旦消费者从持久队列中消费了一条持久化消息,RabbitMQ会在持久化日志中把这条消息标记为等待垃圾收集。如果持久化消息在被消费之前RabbitMQ重启,那么Rabbit会自动重建交换器和队列(以及绑定),并重新发布持久化日志文件中的消息到合适的队列。

 

9. Exchange是什么?

  Exchange类似于数据通信网络中的交换机,提供消息路由策略,producer不是通过信道直接将消息发送给queue,而是先发送给Exchange。一个Exchange可以和多个Queue进行绑定,producer在传递消息的时候,会传递一个ROUTING_KEY,Exchange会根据这个ROUTING_KEY按照特定的路由算法,将消息路由给指定的queue。和Queue一样,Exchange也可设置为持久化,临时或者自动删除。

  Exchange的三种类型:

  1)Direct直接交换器,工作方式类似于单播,Exchange会将消息发送完全匹配ROUTING_KEY的Queue。

  2)Fanout广播交换器,不管消息的ROUTING_KEY设置为什么,Exchange都会将消息转发给所有绑定的Queue。

  3)Topic主题交换器,工作方式类似于组播,Exchange会将消息转发给和ROUTING_KEY模糊匹配的队列。

 

10. 什么是Binding?

  所谓绑定就是将一个特定的Exchange和一个特定的Queue绑定起来。Exchange和Queue的绑定可以是多对多的关系。

 

11. 通信过程?

  1)P1生产消息,发送给服务器端的Exchange;

  2)Exchange收到消息,根据ROUTINKEY,将消息转发给匹配的Queue1;

  3)Queue1收到消息,将消息发送给订阅者C1;

  4)C1收到消息,发送ACK给队列确认收到消息;

  5)Queue1收到ACK,删除队列中缓存的此条消息

 

12. rabbitMq、activeMq、rocketMq、kafka对比分析

MQ种类

单机吞吐量 时效性 可用性 消息可靠性 语言 功能支持
rabbitMq 万级 毫秒 高,基于主从架构实现高可用性 有较低的概率丢失数据 基于erlang开发 MQ领域的功能极其完备
activeMq 万级 微秒 高,基于主从架构实现高可用性 有较低的概率丢失数据 基于erlang开发 基于erlang开发,所以并发能力很强,性能极其好,延时很低
rocketMq 十万级 毫秒 非常高,分布式架构 经过参数优化配置,可以做到0丢失 基于JAVA开发 ,MQ功能较为完善,还是分布式的,扩展性好
kafka 十万级 毫秒 非常高,分布式架构 经过参数优化配置,可以做到0丢失 基于JAVA、Scala开发 功能较为简单,主要支持简单的MQ功能.在大数据领域的实时计算以及日志采集被大规模使用

 


版权声明:本文为zheng2780071070原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。