kafka-python在用户重启后从上一次生成的消息中读取

时间:2017-04-05 16:57:43

标签: python apache-kafka kafka-python

我使用kafka-python来消费来自kafka队列的消息(kafka版本0.10.2.0)。特别是我正在使用KafkaConsumer类型。 如果消费者停止并在一段时间后重新启动,我想从最新生成的消息重新启动,即删除消费者关闭期间产生的所有消息。 我怎样才能做到这一点?

由于

4 个答案:

答案 0 :(得分:1)

谢谢,

它有效!

这是我的代码的简化版本:

consumer = KafkaConsumer('mytopic', bootstrap_servers=[server], group_id=group_id, enable_auto_commit=True)
#dummy poll
consumer.poll()
#go to end of the stream
consumer.seek_to_end()
#start iterate
for message in consumer:
    print(message)

consumer.close()

The documentation表示poll()方法与迭代器接口不兼容,我想这是我在脚本末尾的循环中使用的接口。但是,从初始测试开始,此代码看起来可以正常工作。

使用它是否安全?或者我误解了这个文件?

由于

答案 1 :(得分:0)

您不会Box = function() { this.mesh = false; var loader = new THREE.JSONLoader(); var scope = this; loader.load('json/model.json', function(geometry, materials) { scope.mesh = new THREE.Mesh(geometry, new THREE.MultiMaterial(materials)); scope.mesh.scale.x = scope.mesh.scale.y = scope.mesh.scale.z = 0.75; scope.mesh.translation = geometry.center(); scene.add(scope.mesh); }); } Box.prototype.rotateBox = function() { if (!this.mesh) { return; } this.mesh.rotation.x += .001; this.mesh.rotation.y += .01; } 到日志的末尾。

请记住,您首先需要订阅某个主题才能进行搜索。此外,订阅是懒惰的。因此,您还需要在寻找之前添加“虚拟民意调查”。

seekToEnd()

答案 2 :(得分:0)

回答你的回答中的问题:

据我了解,当你执行consumer.poll()时,会返回一个字典。因此,当我想要查询信息时,我使用循环来浏览字典。

consumer = KafkaConsumer('mytopic', bootstrap_servers=[server], group_id=group_id, enable_auto_commit=True)
messages = consumer.poll()
data = []
for msg in messages:
    for value in messages[msg]:
       #Add just the values to the list
       data.append(value[6])

我相信你正在做的是用consumer = KafkaConsumer('mytopic', bootstrap_servers=[server], group_id=group_id, enable_auto_commit=True)获取迭代器然后用

走迭代器
#start iterate
for message in consumer:
    print(message)

看起来你实际上只获得了民意调查的500个结果。您可以通过将max_poll_records=5添加到KafkaConsumer配置来确认这一点。然后,当您运行代码时,如果打印出超过5条消息,您可以告诉您没有使用轮询功能。

希望有所帮助!

答案 3 :(得分:0)

这是一种方便的方法,可以通过列表中的轮询返回所有消息:

while True:
  messages = [] # Store all messages
  crs = [] # Store all consumer records
  tpd = consumer.poll(timeout_ms=60000, max_records=1)
  [ crs.extend(tp) for tp in tpd.values() ] # List of cr's
  [ messages.extend([json.loads(cr.value)]) for cr in crs ]
  print messages