1.简介
kafka是由LinkedIn开源的一款分布式消息系统,使用scala语言开发,因其可扩展性和高吞吐率而被广泛使用。
开源到Apache以后已发展成一个分布式的实时处理平台,它具有以下特性:
* 可以发布-订阅消息,作为ESB使用。
* 可以以容错的方式存储流式记录。
* 可以实时的处理流式数据。
* 可以在系统或者应用之间创建可靠的实时流式数据通道。
* 可以构建实时的应用用来处理流式数据。
* 可以运行在一个或者多个机器的集群上,并且很容易扩展。
* 支持多个消费者。
* 自动负载均衡以及自动故障转移。
* 消息可以持久化到磁盘,支持批量消费。
* 顺序读写磁盘。
* 基于tcp协议。
2.架构
一个典型的kafka体系包含若干producer,用来将数据发送到kafka;多个broker;多个consumer group,每个
group又有多个consumer;以及一个zookeeper集群用来管理kafka集群的配置、leader选举等。架构图如下:
3.kafka组件
各组件简述如下:
name | scribe |
---|---|
broker | 一个kafka节点就是一个broker,一个或者多个broker组成一个集群,broker越多集群性能越好。 |
topic | \<k,v>结构消息的key,用来对不同的消息归类。 |
producer | 消息生产者,用来向broker发送消息。 |
consumer | 消息消费者,用来接收来自broker的消息或者从broker拉取消息。 |
consumerGroup | 消费组,一个消费组里有一个或者多个消费者。同一个消费组所有的消费者接收到的消息是一个整体,不同消费组各自收到的消息是一个整体。 |
partition | 一个topic可以有多个partition,每个partition的内部是有序的。 |
下面对其中的两个组件做进一步说明。
3.1 topic
topic是用来对消息归类的,每个topic可以认为包含一类消息。topic可以有一个或多个partition,topic是逻辑上的存储
结构,partition是物理上的存储结构。如图:
每个partition是有序的、不可变的并且可以追加写入的(采用顺序写入磁盘的方式,速度快于随机写内存)
消息在partition里面有一个唯一的标识id叫offset。当发送消息时可以指定消息的key,producer可以根据key来判断将
消息发送到哪个partition,partition机制可以通过指定producer的partition.class这一参数来指定,该class必须实现kafka.producer.Partitioner接口。
好的分区策略可以让消息均匀的分布到不同的partition,以此达到水平扩展的目的。
partition的数量可以通过$KAFKA_HOME/config/server.properties来指定。如下:
# The default number of log partitions per topic. More partitions allow greater
# parallelism for consumption, but this will also result in more files across
# the brokers.
num.partitions=3
3.2 consumer
consumer通过consumer groupname来标识,消息会被发送到consumer group的其中一个,consumer实例可以在不同
的进程或者不同的机器上。不同consumer group消费同一个topic消息示例如下:
如上:一个topic有四个partition,分别为P0-P3,分布在两个broker上。同时,有两个consumer group,A有两个
consumer实例,B有四个consumer实例。A组和B组属于不同的consumer group,所以他们都会topic所有的消息数据。
在A和B内部每个consumer会均衡的收到这个topic的消息。