RabbitMQ与Kafka的架构区别

RabbitMQ与Kafka是两种常用的消息队列,下面介绍一下它们的原理和区别

一、RabbitMQ的架构:

    RabbitMQ是一个分布式系统,这里面有几个抽象概念。

  • broker:每个节点运行的服务程序,功能为维护该节点的队列的增删以及转发队列操作请求。
  • master queue:每个队列都分为一个主队列和若干个镜像队列。
  • mirror queue:镜像队列,作为master queue的备份。在master queue所在节点挂掉之后,系统把mirror queue提升为master queue,负责处理客户端队列操作请求。注意,mirror queue只做镜像,设计目的不是为了承担客户端读写压力。

如上图所示,集群中有两个节点,每个节点上有一个broker,每个broker负责本机上队列的维护,并且borker之间可以互相通信。集群中有两个队列A和B,每个队列都分为master queue和mirror queue(备份)。

当客户端在消费队列时,都是从master进行消费,如上图,两个客户端分别连接不同的broker,第一个直接从broker中获取消息,第二个连接的broker不是master,就只能由mirror路由到master,再从master获取消息。

消息的生产如上图,由生产者生成消息发送给master,再由master同步给mirror。即使A-producer连接的是mirror,也是先由mirror路由到master,再master保存消息以后再发送给mirror。

RabbitMQ数据的生成和消费都是通过master进行,miror只是起到一个数据备份的作用。这样保证了数据的一致性,同时也影响了效率。

二、Kafka的架构:

    RabibitMQ的分布式设计虽然保证了数据的可靠性,但是没有利用集群的优势来提高吞吐量。Kafka作为一个分布式队列则改进了这一点。Kafak的架构如下:

Kafka将broker分为多个Partition,即分片。一个Broker有多个主分片,每个主分片又有若干副分片做备份,同步机制类似于RabbitMQ。这样消息在生产和消费时,多个客户端可以同时和集群中的多个机器进行,提高了并发。但是,如果Partition的个数大于1,就无法保证消息的顺序。所以在使用Kafka时,如果要求消息的接收和发送顺序一致,就要把Partition设置为1。

三、RabbitMQ与Kafka比较:

1、吞吐量

   kafka吞吐量更高:
  1)Zero Copy机制,内核copy数据直接copy到网络设备,不必经过内核到用户再到内核的copy,减小了copy次数和上下文切换次数,大大提高了效率。
  2)磁盘顺序读写,减少了寻道等待的时间。
  3)批量处理机制,服务端批量存储,客户端主动批量pull数据,消息处理效率高。
  4)存储具有O(1)的复杂度,读物因为分区和segment,是O(log(n))的复杂度。
  5)分区机制,有助于提高吞吐量。

2、可靠性
rabbitmq略胜:
  之前Kafka是为日志的传输而设计,所以可靠性比如rabbitmq,但是后面Kafka又做了改进,开发者可以跟进自己的需求做不同的配置,如设置ack=1,表示producer(消息发送方)收到leader副本确认,才会认为发送成功。在consumer手动设置消息确认,这样可以保证消息不被丢失。但是由于Kafka需要zk参与集群的管理,涉及到的机器更多,可靠性不如rabbitmq。

3、高可用
  1)rabbitmq采用mirror queue,即主从模式,数据是异步同步的,当消息过来,主从全部写完后,回ack,这样保障了数据的一致性。
  2)每个分区都可以有一个或多个副本,这些副本保存在不同的broker上,broker信息存储在zookeeper上,当broker不可用会重新选举leader。
  kafka支持同步负责消息和异步同步消息(有丢消息的可能),生产者从zk获取leader信息,发消息给leader,follower从leader pull数据然后回ack给leader。

4、负责均衡
  1)kafka通过zk和分区机制实现:zk记录broker信息,生产者可以获取到并通过策略完成负载均衡;通过分区,投递消息到不同分区,消费者通过服务组完成均衡消费。
  2)需要外部支持。

四、总结:

     rabbitmq在低吞吐量的业务中部署方便(不需要zk)、可靠性高,也满足高可用。kafka吞吐量大,高可靠性需要手动设置和编码实现,比rabbitmq复杂。所以在底吞吐量业务中建议使用rabbitmq、在高吞吐量业务中建议使用kafka

    

你可能感兴趣的:(消息队列)