初识Kafka:分布式消息系统比较
主要提要
- 消息队列系统的应用场景
- 流行的消息队列系统ActiveMQ、RabbitMQ、Kafka的比较
- kafka支持的客户端语言
1.消息系统的使用场景
在我们大量使用分布式数据库、分布式计算集群的时候,会遇到这样的问题:
- 分析用户行为(pageviews),以便设计出更好的广告位
- 对用户搜索关键词进行统计,分析出当前的流行趋势
- 有些数据,存数据库浪费,直接存硬盘操作效率低
这些场景具有共同的特征:
- 数据是由上一个模块产生
- 下一个模块对上一个模块的数据进行计算、处理、统计和分析
以上场景适合使用消息系统,尤其是分布式消息系统
2.Kafka定义
关键点:
- 是一个分布式消息系统
- 由LinkedIn使用Scala编写,用作LinkedIn的
- 活动流(Activity Stream)的基础
- 运营数据处理管道(Pipeline)的基础
- 优势特点
- 高水平扩展
- 高吞吐量
应用领域:已被多加不同类型的公司作为多种类型的数据管道和消息系统使用
因为kafka的高水平扩展和高吞吐的能力,目前越来越多的开源分布式处理系统,如flume(用于日志收集)、Storm(用于实时数据处理)、Spark(用于内存数据处理)、elasticsearch(用于全文检索)都支持与Kafka集成。
3.目前开源分布式消息系统比较
比较项 | ActiveMQ | RabbitMQ | Kafka |
---|---|---|---|
公式/社区 | Apache | Mozilla Public License | Apache/LinkedIn |
开发语言 | java | Erlang | Scala |
支持的协议 | OpenWire\STOMP\REST\XMPP\ AMQP | AMQP | 类似AMQP |
事务 | 支持 | 不支持 | 不支持 |
集群 | 支持 | 支持 | 支持 |
负载均衡 | 支持 | 支持 | 支持 |
动态扩容 | 不支持 | 不支持 | 支持(Zookeeper) |
各种分布式消息队列MQ对比详解:
- 开发语言:JAVA和Scalca是运行在JVM上的两种语言;Erlang和最近比较火的Go一样,在语言级别就支持高并发的服务器端开发语言,所以RabbitMQ天生就有很高的性能
- 支持的协议:消息系统都是消息中间件,所以设计和实现消息系统都依靠一套相关的协议,其中ActiveMQ支持众多的协议;RabbitMQ严格按照AMQP协议进行设计实现,受到了很多约束,所以设计上不如Kafka精妙;Kafka仿照AMQP设计了一套面向高性能但是并不通用的协议;AMQP(Advanced Message Queuing Protocol)高级消息队列协议
- 事务:事务的概念最早出现在传统的数据库中,多个操作提交,这些操作要么全部成功要么全部失败,不可能部分成功部分失败,例如在转账时,付款和收款必须是同一个事物。事务对应到分布式消息队列中,就是多条消息一起发送,要么全部发送成功要么全部失败,不可能部分成功部分失败。目前只有ActiveMQ支持事务,RabbitMQ、Kafka以追求更高的性能为目标,所以不支持事务
- 集群:多台服务器组成,消息系统组成的集群增加或者减少一台服务器对生产者和消费者是透明的,无感知的
- 负载均衡:大量生产者和消费者向消息系统发出请求,消息系统必须能够均衡这些请求,使得每一台服务器的请求数达到平衡,避免某台服务器超负荷
- 动态扩容:若不支持动态扩容,则要先停止服务、再停掉消息系统,增加减少服务器,重启消息系统,最后重启服务,这对很多公司是不可接受的。只有Kafka支持,动态增加减少服务器并不影响生产环境的服务。
此外,
- ActiveMQ:还支持Java消息服务(Java Message Service,JMS)的消息中间件,意味着客户端可以使用java编写的程序,可以和消息系统无缝的进行通信
- 由于Kafka的高吞吐量和高水平扩展的能力,阿里巴巴的metaq、rocketmq等各种消息系统要么改造自Kafka要么借鉴kafka的思想
- ActiveMQ、RabbitMQ和Kafka相比不具有高吞吐量和高水平扩展的能力
- kafka动态扩容是通过zookeeper来实现的,kafka增加或者减少节点,都会在zookeeper上触发相应的事件,kafka系统会捕获这些事件来进行新一轮的负载均衡;客户端也可以捕获这些事件。
4.AMQP协议
三种比较流行的消息队列要么支持AMQP协议,要么借鉴了AMQP协议思想。AMQP协议主要由一下三个组件组成
【producer】→(push)→【broker】←(pull)←【comsumer】
- 消费者:从消息队列中请求消息的客户端应用程序
- 生产者:向broker发送消息的客户端应用程序
- AMQP服务器端(broker):用来接收生产者发送的消息并将这些消息路由给服务器中的队列;例如,kafka将生产者发送的消息动态的添加到磁盘,并给每一条消息一个偏移量
5.kafka支持的客户端语言
官方wiki中指出,kafka客户端支持当前大部分主流语言,包括
- Producer Daemon
- Python
- Go (AKA golang)
- C/C++
- .net
- Clojure
- Ruby
- Node.js
- Alternative Java Clients
- Storm
- Scala DSL
- HTTP REST
- JRuby
- Perl
- stdin/stdout
- Erlang
- PHP
- Rust
可以使用以上任何一种语言和kafka服务器进行通信,即编写自己的consumer程序和produce程序。一个分布式系统支持的客户端语言是很重要的,因为不同的开发人员使用不同的语言是很常见的现象,若只支持一种语言则会提高开发和维护的成本。