使用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