kafka深入理解(三)之消费者

一、消费方式

kafka的消费者采用拉取的方式从队列中获取消息,因为推送的方式消息发送的速率是由消费者端决定的,其很难匹配消费者端的速率。有的消费者端速率很慢不能全部接收到队列中所推送的消息,有的消费者端速率很快则会造成资源的浪费。但是消费者拉取消息的方式也存在缺点,就是需要维护一个长时间的轮询,消费者一消费完消息后便需要不断地询问队列中是否有新的消息,这样对资源也是一种浪费。Kafka中有一种时间的机制,即消费者查询过一次后没有新的消息的话就会间隔一段时间再去询问,这个时间的长度是由时长参数 timeout决定的。(pull 模式不足之处是,如果 kafka 没有数据,消费者可能会陷入循环中, 一直返回空数据。 针对这一点, Kafka 的消费者在消费数据时会传入一个时长参数 timeout,如果当前没有数据可供消费, consumer 会等待一段时间之后再返回,这段时长即为 timeout。)

二、分区分配策略

一个Topic有多个partition,一个消费者组有多个消费者,这样就涉及到分区分配,即决定哪个消费者消费哪个partition。kafka有两种分配策略一是 RoundRobin,一是 Range。

RoundRobin:该分配策略就是将一个消费者组里面所有消费者订阅的topic看成一个整体,然后按照不同topic的不同partition按照轮询的方式分配给每个消费者,这样虽然会使每个消费者消费的消息数量基本一致,但是在将所有topic看成一个整体后,有可能会将没有订阅某个topic的消费者消费了该topic某个分区的消息,使用该策略应该是消费者组里面所有的消费者订阅的topic都一样的时候。

Range:该分配策略是按照topic来分的,订阅了同一个Topic的消费者依次去取,这样会造成每个消费者消费消息的数量不均衡。kafka默认采用该种方式取队列中的消息。

什么时候会触发这些分配策略?

当消费者数量发生变化时,都会触发分配策略重新分配。

三、offset的维护

由于消费者在消费数据时有可能会突然宕机,所以需要维护一个offset,当该消费者恢复的时候可以知道从哪里再开始消费,也可以让和他该消费者一个组的其他消费者消费。如果其维护的offset不能让其消费者组的其他的消费者知道的话,和他同一个消费者组其他的消费者就不能从offset开始继续消费消息。所有该offset是由消费者组所共享的,是由消费者组--topic和partition共同决定的。

 kafka在0.9版本之前是默认将offset保存在zookeepe中的,从0.9版本开始,消费者默认将offset保存在kafka一个内置的topic中,该topic为_consumer_offsets。

在同一个消费者组里面同一时刻只能有一个消费者消费消息。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值