赞
踩
一个topic 可以配置几个partition,produce发送的消息分发到不同的partition中,consumer接受数据的时候是按照group来接受,kafka确保每个partition只能同一个group中的同一个consumer消费,如果想要重复消费,那么需要其他的组来消费。Zookeerper中保存这每个topic下的每个partition在每个group中消费的offset 。
新版kafka把这个offsert保存到了一个__consumer_offsert的topic下
这个__consumer_offsert 有50个分区,通过将group的id哈希值%50的值来确定要保存到那一个分区. 这样也是为了考虑到zookeeper不擅长大量读写的原因。
所以,如果要一个group用几个consumer来同时读取的话,需要多线程来读取,一个线程相当于一个consumer实例。当consumer的数量大于分区的数量的时候,有的consumer线程会读取不到数据。
假设一个topic test 被groupA消费了,现在启动另外一个新的groupB来消费test,默认test-groupB的offset不是0,而是没有新建立,除非当test有数据的时候,groupB会收到该数据,该条数据也是第一条数据,groupB的offset也是刚初始化的ofsert, 除非用显式的用–from-beginnging 来获取从0开始数据
消费者可以通过使用samegroup.id
加入一个组。
问题:
kafka消费者使用自动提交的模式,提交间隔为2s,消费者在获取数据的时候处理0.5s,从kafka拉取过来的数据只够处理1秒。那么消费者下次拉取过来的数据是否是已经消费完的数据?或者说由于数据已经消费,但是偏移量没有被提交,是否会造成下次获取的数据是从旧的偏移量开始拉取? |
回答:
不会是旧数据,kafka的消费者也有自己偏移量,这个偏移量是从kafka中读取的量,和kafka提交的偏移量不一样。假设变成自动提交偏移量,而且没有写提交的逻辑,同一个消费者,除了第一次或者rebalance会根据已提交的offset来获取数据,剩下的时候都是根据自己本地的偏移量来获取的。这个模式有点类似于用桶取水,用瓢来喝水。消费者就是桶的角色,poll就是瓢的角色。 |
我们把重复消费的情况分为2种,一种是想避免的,一种是故意如此的。
注:这里不讨论那个消费者提交的offset的作用。
- public static void consumer(Properties properties,String info) {
- System.out.println(info);
- KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer(properties);
- kafkaConsumer.subscribe(Arrays.asList(new String[]{"hello"}));
- boolean flag = false;
- while (true) {
- ConsumerRecords<String, String> poll = kafkaConsumer.poll(100);
- if (!poll.isEmpty()) {
- for (ConsumerRecord<String, String> o : poll) {
- System.out.println(o.value() + o.offset());
- //假设场景为重复消费3,这里需要根据业务来提交便宜量
- if (o.offset() == 3) {
- //手动提交偏移量
- Map<TopicPartition, OffsetAndMetadata> currentOffset = new HashMap<TopicPartition, OffsetAndMetadata>();
- //提交的偏移量,这个偏移量就是下次消费的第一条数据
- currentOffset.put(new TopicPartition(o.topic(), o.partition()), new OffsetAndMetadata(o.offset()+1, ""));
- kafkaConsumer.commitSync(currentOffset);
- flag = true;
- break;
- }
- }
- }
- if(flag){
- kafkaConsumer.close();
- break;
- }
- }
- }
这里也必须注意,kafka并不是数据库,他保存的数据有持久化的时间和大小的限制,可能你提交的偏移量的数据已经被kafka清理掉了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。