Rabbit MQ和Kafka

这些天读了两本关于Rabbit MQ和Kafka的书,把一些关键点总结下。

一、Rabbit MQ

Rabbit MQ用Erlang语言实现了AMQP(advanced Message Queuing Protocol)协议。相比于Java领域的JMS,AMQP没有在API层面进行限定,而是定义了网络交换的数据格式。因此,JMS只能用于Java平台,而AMQP可天然就是跨平台的,比如,producer可以是java,consumer可以是python。

Rabbit MQ在2013年5月并入Pivotal。

安装Rabbit MQ需要先安装Erlang环境。

1.1交换器、路由键、绑定

这是Rabbit MQ中的基本概念。

Rabbit MQ的生产者不能直接将消息发送给队列,而是发送到Exchange(交换器)中,由交换器通过RoutingKey(路由键)和Binding(绑定)决定消息最终会进入那些队列。

队列跟交换器绑定时,一般会指定BindingKey,生产者发送消息到交换器时,会指定一个RoutingKey,当BidingKey和RoutingKey匹配时,消息才会被路由到对应的队列中。BindingKey并不是在所有情况下都生效,如果路由器的类型是fanout,交换器就会忽略BingdingKey,直接将消息发送给所有绑定到该交换器的队列。

通过这些规则,Rabbit MQ是没有JMS中的Queue和Topic的概念,但是可以实现类似的点对点和广播的功能。

1.2一些特性

支持过期时间(TTL)、死信队列、延迟队列、优先级队列、类RPC调用,应用层可以依赖这些特性实现不同的业务逻辑。

另外通过事物机制、发送方确认机制可以保证让生产者确定消息已经被broker接收。broker接收到消息后,可以将消息持久化,以保证消息数据在异常情况下不会丢失。

通过vhost,Rabbit MQ可以实现多租户。

1.3集群、跨集群、负载均衡

Rabbit MQ的集群有两种模式,普通模式和镜像模式。

1.3.1普通模式

普通模式只会同步四种类型类型的元数据:

  • 队列元数据
  • 交换器
  • 绑定关系元数据
  • vhost元数据

而消息数据只会存在于其中一个节点。当有消费者从其它节点拉取数据时,Rabbit MQ会临时在节点间进行消息传输。

1.3.2镜像模式

镜像模式则会把队列中的数据进行同步。即Highly Available (Mirrored) Queues

1.3.3跨集群和负载均衡

Rabbit MQ可通过Rederation或者Shovel进行跨集群访问。

Rabbit MQ可以通过HAProxy、keepalived、LVS进行不同级别的负载均衡。

二、Kafka

Kafuka最初由Linkedin开发,现在是apache的顶级项目http://kafka.apache.org/。它使用Zookeeper作为协调管理,高吞吐量、分布式、支持分区和副本,可以用来构建实时数据管道和流应用程序。

2.1重要概念

分区、副本、偏移量、日志段(segment)

Kafka将一组消息归纳为一个主题(topic),而一个主题有可以划分为多个分区(partition)。通过分区和分区副本实现高并发和高可用。

分区的副本又分为Leader副本和Follwer副本。Leader副本负责客户端的读写请求,Follower副本从Leader同步数据。

Kafka通过文件系统存储和缓存消息。为了提高磁盘的读写效率,Kafka采用的是顺序读写的方式,通过数据的偏移量(offset)和日志段,kafka读写数据的时间复杂度卫O(1)。由于各日志段是单独文件存储,在删除的时候,直接删除相应文件即可,磁盘操作效率很高。

Kafka使用ZooKeeper存储元数据信息,如:代理节点信息、Kafka集群信息、旧版消费者信息以及其消息偏移量信息、主题信息、分区状态信息、分区副本分配方案信息、动态配置信息等。Zookeeper使Kafka可以很方便的进行集群水平扩展和数据迁移。

2.2流处理

Kafka的流处理功能可以对进去kafka的消息进行过滤、聚合等操作。

2.3日志处理框架

Kafka一个景点的应用场景是,跟Flume和ELK结合构建大型分布式系统的日志处理模块。Kafka在这里即作为消息队列来减轻后端ELK的处理压力,另外也可以使用流处理对日期数据进行加工。架构如下图所示(选自离线部署ELK+kafka日志管理系统,作者:我的八仙桌):

三、Rabbit MQ和Kafka比较

  1. 架构模型方面,

    RabbitMQ遵循AMQP协议,RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding组成了消息的路由键;客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据)。rabbitMQ以broker为中心;有消息的确认机制。

    Kafka遵从一般的MQ结构,producer,broker,consumer,以consumer为中心,消息的消费信息保存的客户端consumer上,consumer根据消费的点,从broker上批量pull数据;无消息确认机制。

  2. 在吞吐量,
    Kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。

    RabbitMQ在吞吐量方面稍逊于kafka,他们的出发点不一样,rabbitMQ支持对消息的可靠的传递,支持事务,不支持批量的操作;基于存储的可靠性的要求存储可以采用内存或者硬盘。

  3. 在可用性方面,
    RabbitMQ支持miror的queue,主queue失效,miror queue接管。
    Kafka的broker支持主备模式。

  4. 在集群负载均衡方面,
    Kafka采用zookeeper对集群中的broker、consumer进行管理,可以注册topic到zookeeper上;通过zookeeper的协调机制,producer保存对应topic的broker信息,可以随机或者轮询发送到broker上;并且producer可以基于语义指定分片,消息发送到broker的某分片上。

    RabbitMQ的负载均衡需要单独的loadbalancer进行支持。

参考资料:

  • 消息中间件—RabbitMQ(集群原理与搭建篇)https://www.jianshu.com/p/6376936845ff
  • RabbitMQ学习之集群模式 https://www.cnblogs.com/telwanggs/p/7124832.html
  • Kafka文件存储机制及offset存取 https://www.cnblogs.com/ITtangtang/p/8027217.html
  • RabbitMQ和kafka从几个角度简单的对比 http://soledede.iteye.com/blog/1974988
  • RocketMQ与kafka对比(18项差异)http://jm.taobao.org/2016/03/24/rmq-vs-kafka/
  • 消息队列MQ选型 - Kafka、RabbitMQ对比 https://www.jianshu.com/p/20f9be3c45d3
  • RabbitMQ消息可靠性分析 https://www.jianshu.com/p/ea04ee9504c3

猜你喜欢

转载自blog.csdn.net/quqtalk/article/details/84817651