kafka消费者offset相关设置

1.自动提交offset&手动提交offset
自动提交,只需设置"enable.auto.commit",为"true"即可,"auto.commit.interval.ms",为默认自动提交的时间,一般设为"1000",单位ms;
手动提交,设置"enable.auto.commit",为"false"。手动提交有两种形式,一种是提交所有订阅的topic,直接在每次消费完成之后调用consumer.commitSync();另一种则是单独提交一个topic的partition,调用形式consumer.commitSync(Collections.singletonMap(partition, new OffsetAndMetadata(lastOffset + 1)),这种形式使我们对topic可以有更加精细的控制,


2.subscribe&assign
在使用subscrible函数时,只指定了topic,不指定partition,这个时候,采用消费者组,partition会自动在这个group的所有对应consumer中分摊,会自动实现负载均衡,即rebalance。
rebalance的触发条件有三种:
组成员发生变更(新consumer加入组、已有consumer主动离开组或已有consumer崩溃了——这两者的区别后面会谈到)
订阅主题数发生变更——这当然是可能的,如果你使用了正则表达式的方式进行订阅,那么新建匹配正则表达式的topic就会触发rebalance
订阅主题的分区数发生变更
Rebalance的细节这里不再讨论,详见http://www.aboutyun.com/thread-23447-1-1.html


assign函数允许你将控制粒度精确到topic中的一个确定的partition,调用方法:
     String topic = "foo";
     TopicPartition partition0 = new TopicPartition(topic, 0);
     TopicPartition partition1 = new TopicPartition(topic, 1);
     consumer.assign(Arrays.asList(partition0, partition1));


注意,subscribe和assign函数是不可以同时使用的,因为subscribe是自动分配,并有rebalance功能,而assign则是将partition固定给consumer,因此二者不能同时使用。


3.seek(TopicPartition, long)   seekToBeginning(Collection)   seekToEnd(Collection) 
考虑这样的情形,当你的consumer消费完数据后,在提交offset之前,系统崩溃,再次重启,则最后一批消费的数据会被重复消费。kafka本身并不能保证"exactly once",只能保证"at-least once",
因此在有些场景下,用户可以选择将offset信息保存在一个安全的地方,比如说数据库里面,保证数据的消费和offset的提交在同一个transaction中,这样可以保证"exactly once"。
这种场景下,除了手动提交offset外,还要用到seek函数来手动定位offset信息。
TopicPartition topicPartition1=new TopicPartition(topic,0);
consumer.assign(Arrays.asList(topicPartition1));
 consumer.seek(topicPartition1,3);


This type of usage is simplest when the partition assignment is also done manually (this would be likely in the search index use case described above). If the partition assignment is done automatically special care is needed to handle the case where partition assignments change. This can be done by providing a ConsumerRebalanceListener instance in the call to subscribe(Collection, ConsumerRebalanceListener) and subscribe(Pattern, ConsumerRebalanceListener)
在使用seek的时候需要注意,如果你是采用assign函数时,使用seek就非常简单,因为二者都是针对一个分区,不需要额外的设定;如果是使用subscribe的时候,则需要格外小心,因为订阅过程中会有分区Rebalance,需要提供一个ConsumerRebalanceListener 实例给subscribe。
如果直接使用subscribe(Collection)时,会报错误:
java.lang.IllegalStateException: No current assignment for partition mytopic-1
    at org.apache.kafka.clients.consumer.internals.SubscriptionState.assignedState(SubscriptionState.java:251)
    at org.apache.kafka.clients.consumer.internals.SubscriptionState.seek(SubscriptionState.java:276)
    at org.apache.kafka.clients.consumer.KafkaConsumer.seek(KafkaConsumer.java:1135)


4.从头消费

若想从头消费数据,则可以设置"auto.offset.reset"为"earliest",注意要使用一个全新的group.id,即启用一个新的消费者组,否则是不起作用的。


  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值