目录
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功能.在大数据领域的实时计算以及日志采集被大规模使用 |