《kafka实战》之consumer

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lyzx_in_csdn/article/details/83929949

kafka中的consumer
1、旧版本的consumer api是由scala语言编写,新版本的consumerapi是由java语言编写
    新版本的consumer api采用全新的offset管理
2、消费者组的概念
    消费者使用一个消费者组名标识自己,topic中的每条消息都会分配到某个消费者组的一个消费者实例上
    一个消费者组订阅一个topic,每个topic中的partition中的消息都只会分配到一个消费者实例上,这就好比
    3个人有6个苹果,如何分配的问题?
3、位移(offset)
    kafka的消费者(consumer)自己维护offset,并定时上传该offset,所以在kafka服务端只需要保存某个消费者的offset即一个long值即可
    保存的格式是 groupId.topicName.partitionId=offset  这样就唯一的标识了一个组消费topic的某一个partition的位移量了
4、位移提交
    旧版本的consumer api把位移提交到zookeeper中,新版本的consumer api把位移提交到自身的 __consumer_offsets 的topic里面
5、构建consumer
    构建consumer必需的元素
    bootstrap.servers  kafka集群的位置即Ip1:prot,Ip2:port 建议使用域名,如果集群数量很多当然也只写一部分,kafka可以根据其中的一部分找到其他的broker
    group.id 标识一个组
    key.deserializer key的反序列化器,kafka中存放的是字节数组,消费的时候需要通过反序列化器把字节数组转换为自己的消息格式
    value.deserializer 与key.deserializer的作用类似
6、获取消息
    新版本的 consumer api采用了类似于linux的select I/O机制,
    采用consumer的poll方法获取数据,poll方法有一个超时时间t,
    当调用poll方法 ,返回的条件
    1、超过了超时时间
    2、消息的量达到了设定值
        2.1、消息达到了指定的条数(由参数max.poll.records控制)
        2.2、消息达到了指定的大小(由参数fetch.max.bytes控制)
    新版本的api采用双线程的方式,使用一个线程管理多个socket连接,即包括coordinator的协调消费者组的rebalance
    以及数据的获取都在poll方法中
    另外的一个线程做心跳线程
    
7、poll方法的使用
    1、如果某个线程只是为了消费消息,则可以设置超时时间为无限,这儿设置为无限不是说让poll无限等待,看前面说过的poll方法
    返回的条件可以明白,条件1已经不起效,只有当条件2生效后才会返回,即此时只有消息达到指定的量的时候才会返回,然后把这些消息交给
    其他线程处理
    2、某个线程除了获取消息外还要做其他的操作则可以使用一个有业务意义的超时时间,在线程阻塞期间可以让其他线程做其他的事情

猜你喜欢

转载自blog.csdn.net/lyzx_in_csdn/article/details/83929949