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即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值