Kafka consumer 设置offset

使用kafka预上线环境进行上线前测试,即与线上kafka消费相同集群相同topic不同group的消息。但预上线环境会一直产生消息,而测试则是不定期进行,因此在下次测试时会堆积大量未消费的消息。而想要在测试时使用最新的消息时,目前考虑到有两种解决方案较为简洁:

1. 新增group

每次测试时新增group(可在group后加时间戳区分),初始偏移量offset的配置为kafka.auto.offset.reset=latest,可使每个group获取最新偏移量,只读最新数据。

但不断新增group,topic下的group会不断增加,偏移量_consumer_offsets 多次保存,需要对topic定期清理group_id,较为不友好。

2. 使用seek方法设置offset

如下图所示,在一段时间后kafka会堆积很多消息。

在这里插入图片描述

可以使用KafkaConsumer的seek_to_end函数重置offset为最近可用的offset。

在之前需要poll一次数据,不然会报没有分配partition的错误。说明kafka也是懒加载的,只有在具体poll数据的时候才会分配partition。

还可使用seek_to_beginning函数重置offset为最早可用的offset,及使用seek函数指定某个partition为固定的offset,回溯消息进行消费。

代码如下:

from kafka import KafkaConsumer, TopicPartition

consumer = KafkaConsumer(
    # topic名
    'msg-topic',
    # 消费组
    group_id='STRATEGY_Themis_Display_GROUP_ONLINE',
    # kafka集群
    bootstrap_servers=['kafka01', 'kafka01'],
    # 拉取消息最大个数
    max_poll_records=10
)
# poll一次数据,分配partition
res = consumer.poll(10)
# 指定某个partition的offset为设定值,需引入TopicPartition类型
consumer.seek(TopicPartition(topic='mls-appearance-result-msg', partition=1),54000000)
# 指定offset为最早可用的offset
consumer.seek_to_beginning()
# 指定offset为最近可用的offset
consumer.seek_to_end()
for msg in consumer:
    print msg

使用consumer.seek_to_end(),指定offset为最近可用的offset。

在这里插入图片描述

使用consumer.seek_to_beginning(),指定offset为最早可用的offset,回溯到保存的最早的消息进行消费 。

在这里插入图片描述

使用consumer.seek(TopicPartition(topic=‘mls-appearance-result-msg’, partition=1),54000000),指定partition1的offset为54000000,回溯到固定的offset进行消费 。

在这里插入图片描述


--------------------------文档信息--------------------------
版权声明:非商用自由转载-保持署名-注明出处
署名(BY) :dkjkls(dkj卡洛斯)
文章出处:http://blog.csdn.net/dkjkls

猜你喜欢

转载自blog.csdn.net/dkjkls/article/details/87902099