kafka API-KafkaConsumer类

一个客户端从Kafka集群中消费records
客户端处理:
Kafka broker失败;
当集群中topic和partition的变化客户端也随之进行对应的反应;
和broker协调对消费组进行负载均衡;
和broker维持tcp连接与释放;

consumer是非线程安全的(非同步访问会产生ConcurrentModificationException)。

偏移和消费者位置(Offsets and Consumer Position)
offsets是record在partition中的唯一标识,也表示consumer在partition的position
例如:consumer消费了 offset为0到4的record,那么consumer的当前位置为5
两种position
1)postiion,consumer见过的最高的offset基础上+1,每次调用poll(Duration)它会自增;
2)committed position,最后被安全保存的offset,当处理失败或重启时,consumer会从这个offset恢复,consumer可以选择周期性地提交这个offset,也可以使用commitSync 或commitAsync等手动提交

消费组合主题订阅(Consumer Groups and Topic Subscriptions)
Kafka使用消费组的概念来允许一个进程池
划分消费和处理records的工作,这些进程可以运行在一台或多台机器上来提供伸缩性和容错性。消费者在消费组中共享一个group.id。
每个consumer可以使用subscribe动态地订阅一个topic的列表(set集合,topic名称不可以相同)。Kafka的一个partition只会被一个consumer消费,但是consumer可以消费多个partition。
比如一个主题有四个partition,一个消费组有两个consumer,那么每个consumer会获得两个 partition.。
如果一个消费组中一个consumer失败,这个partition会分配到同一个消费组中的另一个consumer,类似的,如果新的消费者加入消费组,分区会从一个现有的consumer上移到一个新的consumer上面,这叫做rebalancing(重平衡)消费组。rebalancing 也可以使用在新的partition添加到topic或符合subscribed regex的topic创建的时候,消费组通过周期性元数据更新检测新分区。
另外,group自动重分配的时候,consumer可以通过ConsumerRebalanceListener被通知,在这个Listener中可以进行状态清除、手动提交偏移等动作。
consumer可以通过assign(Collection)指定消费哪个分区,自动分区分配将会失效。
检测消费失败(Detecting Consumer Failures)
consumer订阅一组主题之后,通过调用poll(Duration)自动加入消费组。
poll API被设计来保证consumer的活跃性。poll一直被调用,consumer就会一直留在消费组中消费被分配的partition中的消息,poll会周期性地发送心跳给服务器,如果consumer崩溃或发送心跳的时间大于session.timeout.ms,consumer会被认为死亡,他的partition会被重分配。
还有一种情况叫做“livelock”(活锁),consumer一直发送心跳但什么都不做,这样consumer一直占用partition却不消费partition,为避免这种情况,使用max.poll.interval.ms配置poll调用的间隔,如果poll调用的间隔大于这个时间,consumer主动离开消费组,这个时候另一个consumer接盘前一个consumer的partition,,可能会发生commit failure错误(由调用commitSync()引起的CommitFailedException),这是为了保证只有在消费组中活跃的consumer才可以提交offset,所以为了留在group,consumer要不断地调用poll.。
三点:
建议处理消息的线程和消费消息的线程分开
保证commited position小于position,这个需要设置手动提交
可以设置pause partition使poll停止接收records

几个方法:
poll(long timeout) //deprecated,不建议使用
poll(Duration timeout)
consumer没有subscribe/assign会报错
该方法获取到数据马上返回否则会等待timeout时长后没有就返回空records,当调用定制的ConsumerRebalanceListener这个方法可能会在超出timeout时阻塞

这篇文章其实是翻译的,但是CSDN这咋回事,我咋知道这侵不侵权,我还润色了呢?放链接如下,写的挺详细但是是英文的,其它类和方法也有说明:

http://kafka.apache.org/22/javadoc/org/apache/kafka/clients/consumer/Consumer.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值