赞
踩
首先从整体流程介绍一下kafka的使用架构流程图(多个producer、一个topic,一个分组,三个partition、一个分组下的三个consumer):
(1)多个producer可以往一个topic发送消息,同时多个Consumer可以注册该topic,消费该数据。
(2)简单理解topic,Topic在逻辑上可以被认为是一个queue,每条消费都必须指定它的Topic,可以简单理解为必须指明把这条消息放进哪个queue里。
(3)顺序性:多个producer往topic发送数据可以是无序的,消息存储在broker里面是有序的,但是多个consuemr之间是获取消息是无序的。(kafka只能保证一个pratition里面的消息是顺序的:只有一个poartition,和一个consumer时,消息是有序的)
具体: 多个consumers同时从这个服务器消费消息,服务器就会以消息存储的顺序向consumer分发消息。虽然服务器按顺序发布消息,但是消息是被异步的分发到各consumer(保持并发性)上,所以当消息到达时可能已经失去了原来的顺序
(4)partition与group以及consumer数量的对应关系以及匹配关系
一个topic 可以配置几个partition,produce发送的消息分发到不同的partition中,consumer接受数据的时候是按照group来接受,kafka确保每个partition只能同一个group中的同一个consumer消费,如果想要重复消费,那么需要其他的组来消费。Zookeerper中保存这每个topic下的每个partition在每个group中消费的offset 。
(a)一个partition下面只有一个分组(group):
同一消息,只会被该gruop,消费不会被重复消费;
(b)一个partition下面多个分组时:
同一消息会被多个分组消费
以下是讨论只有一个分组的情况:
数量关系:
1)、一个partition、多个consumer时,partition里消息都会堆积到一个broker中,导致硬盘被沾满
2)、多个partition,一个consumer时,所有partition里的消息都会发往该consumer,如果consumer不止一个时,可能会存在有的consumer里面数据消费的多,有的消费的少;
3)、partition数量=consuerm时,消息可以达到负载均衡。
匹配关系,partition是如何与group对应的:
原理:Zookeerper中保存这每个topic下的每个partition在每个group中消费的offset 。新版kafka把这个offsert保存到了一个__consumer_offsert的topic下 ,这个__consumer_offsert 有50个分区,通过将group的id哈希值%50的值来确定要保存到那一个分区。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。