Kafka Consumer
Consumer
High Level Consumer
简要:很多应用场景下,客户程序知识希望从Kafka顺序读取并处理数据,并不太关心具体的offset。
同时也希望提供一些语义,例如同一条消息只被一个Consumer消费(单播)或被所有Consumer消费(广播)。
Kafka High Level API提供了一个从Kafka消费数据的高层抽象,从而屏蔽掉其中的细节,并提供丰富的语义。
Consumer Group
High Level Consumer将从某个Patition读取的最后一条消息的offset存在Zookeeper中(从0.8.2开始同时支持将offset存在Zookeeper中和专用的Kafka topic中)。
这里就有一个问题:如果消费一条消息就将其offset存在Topic中,那么存在Topic的offset数据量将和被消费的数据量是一样的。如果我们想要知道哪条消息被哪个Consumer消费,那么我们就得再起一个Consumer去pull这个存有offset的Topic。而且消息被删除后,可能会影响到offset。这样Kafka不是通过时间等去回收offset,而是通过Compaction的方式,将key想同的value只保留最后一条offset。
这个offset基于客户端程序提供给Kafka的名字来保存,这个名字被称为Consumer Group。
Consumer Group是整个Kafka集群全局唯一的,而非针对某个Topic。
每个High level Consumer实例都属于一个Consumer Group,若不指定则属于默认的Group。
消息被消费后,并不会被删除,只是相应的offset加一。
对于每条消息,在同一个Consumer Group里只会被一个Consumer消费。
不同Consumer Group可消费同一条消息。
(假设一个Broker里就一个Patition)
Kafka的设计理念之一就是同时提供对离线批处理和在线流处理的支持
可同时使用Hadoop系统进行离线批处理,Storm或其它流处理系统进行流处理
可使用Kafka的Mirror Maker将消息从一个数据中心镜像到另一个数据中心
验证 消息的单播和广播方式
1.重新部署集群,目的是将数据清空,启动Kafka和Zookeeper集群
2.创建Topic,设置Topic中Patiton的数目为3个,replication为1个
3.我们设置2组Consumer Group,一组2个Consumer,另外一组1个Consumer
4.Producer发送3条消息test0,test1,test2,发现
High Level Consumer Rebalance
Consumer启动及Rebalance流程
High Level Consumer启动时将其ID注册到其Consumer Group下,在Zookeeper上的路径为/consumers/[consumer group]/ids/[consumer id]
在/consumers/[consumer group]/ids上注册Watch,为了监控Consumer挂了。
在/brokers/ids上注册Watch,为了监控Broker是否挂了
如果Consumer通过Topic Filter创建消息流,则它会同时在/brokers/topics上创建Watch
强制自己在其Consumer Group内启动Rebalace
Consumer Rebalance算法
将目标Topic下所有Partition排序,存于集合P中
对某个Consumer Group下所有Consumer排序,存于集合C中,第i个Consumer记为Ci
N=size(P)/size(C),向上取整
解除Ci对原来分配的Partition的消费权(i从0开始)
将第i*N到(I+1)*N-1个Partitoon分配给Ci
Consumer rebalance算法缺陷及改进
任何Broker或者Consumer的增减都会促发所有的Consumer的Rebalance
Split Brain(脑裂)每个Consumer分别单独通过Zookeeper判断哪些Broker和Consumer宕机,同时Consumer在同一时刻从Zookeeper”看”到的view可能不一样,这是由Zookeeper特性决定的
调整结果不可控,所有Consumer分别进行Rebalance,彼此不知道对应的Rebalance是否成功。
Low Level Consumer
使用Low Level Consumer(Simple Consumer)的主要原因是,用户希望比Consumer Group更好的控制数据的消费,如
同一条消息读多次,方便Replay
只消费某个Topic的部分Partiton
管理事务,从而确保每条消息被处理一次(Exactly once)
与High Level Consumer相对,Low Level Consumer要求用户做大量的额外工作
在应用程序中跟踪处理offset,并决定下一条消费哪条消息
获知每个Partition的Leader
处理Leader的变化
处理多Consumer的协作