kafka原理系列之(二)partition的消费策略

释放双眼,带上耳机,听听看~!

1、topic和partition以及consumer关系
一个topic可以认为一个一类消息,每个topic将被分成多个partition,每个partition在存储层面是append log文件。任何发布到此partition的消息都会被追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),offset为一个long型的数字,它唯一标记一条消息。每条消息都被append到partition中,是顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证)。
一个topic 可以配置几个partition,producer发送的消息分发到不同的partition中,consumer接收数据是按照group来接收。
kafka确保每个partition只能同一个group中的同一个consumer消费,如果想要重复消费,那么需要其他的组来消费。
也就是说partition可以被不同的消费组中的消费者消费。
1.0版本之前的kafka,是由Zookeerper中保存每个topic下的每个partition在每个group中消费的offset。
新版kafka把这个consumer消费到哪条数据的offset保存到了一个__consumer_offset的topic下
这个__consumer_offset 有50个分区,通过将group的id哈希值%50的值来确定要保存到那一个分区。
这样也是为了考虑到zookeeper不擅长大量读写的原因。
所以,如果要一个group用几个consumer来同时读取的话,需要多线程来读取,一个线程相当于一个consumer实例。
当consumer的数量大于分区的数量的时候,有的consumer线程会读取不到数据,造成资源浪费。

总结:

一般partition 是consumer 整数倍,不超过磁盘的数量。
一个partition只能被一个group的唯一consumer消费,但是可以被不同消费group的消费者消费。
2、 设置读取offset的策略:
auto.offset.reset

假设一个topic test 被groupA消费了,现在启动另外一个新的groupB来消费test,
默认test-groupB的offset不是0,而是没有新建立,除非当test有数据的时候,
groupB会收到该数据,该条数据也是第一条数据,groupB的offset也是刚初始化的offset,
除非用显式的用–from-beginnging 来获取从0开始数据

3、kafka消费组group的使用场景
这是Kafka用来实现一个Topic消息的广播(发给所有的Consumer)和单播(发给某一个Consumer)的手段。
一个Topic可以对应多个Consumer Group。如果需要实现广播,只要每个Consumer有一个独立的Group就可以了。
要实现单播只要所有的Consumer在同一个Group里。用Consumer Group还可以将Consumer进行自由的分组而不需要多次发送消息到不同的Topic。
实际上,Kafka的设计理念之一就是同时提供离线处理和实时处理。根据这一特性,可以使用Storm这种实时流处理系统对消息进行实时在线处理,同时使用Hadoop这种批处理系统进行离线处理,还可以同时将数据实时备份到另一个数据中心,只需要保证这三个操作所使用的Consumer属于不同的Consumer Group即可。

给TA打赏
共{{data.count}}人
人已打赏
安全网络

CDN安全市场到2022年价值76.3亿美元

2018-2-1 18:02:50

安全运维

Kubernetes之(二十)Helm程序包管理器

2021-10-12 11:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索