我有一个可读取2个主题的python应用。其中一个就像一个批处理过程(始终在运行),另一个是临时的。
我希望该应用执行批处理,但是在处理了几个条目(即目标)之后检查了临时性。而且,如果临时主题中有项目,请先完成该工作,然后再返回批处理过程
无论如何,这就是我开始的目的:
while True:
for msg_1 in consumer_1:
print('consumer_1 {0}'.format(msg_1.value)
for msg_2 in consumer_2:
print('consumer_2 {0}'.format(msg_2.value)
这当然是行不通的。它卡在第二循环中。
我已经阅读了这篇文章,并尝试实现它(Kafka Consumer - topic(s) with higher priority)。该问题在2017年得到了解答,我认为此后API发生了变化。
while True:
for msg_1 in consumer_1:
print('consumer_1 {0}'.format(msg_1.value)
client = SimpleClient('localhost:9092')
topic_partitions_ids = client.get_partition_ids_for_topic(b'two')
end_offsets = consumer_2.end_offsets(topic_partitons_ids)
committed = consumer_2.committed(topic_partitions_ids)
if end_offsets - committed > 0:
for msg_2 in consumer_2:
consumer_1.pause()
print('consumer_2 {0}'.format(msg_2.value)
consumer_1.resume()
但是我被困在行列中
committed = consumer_2.committed(topic_partitions_ids)
出现错误消息:
分区必须是名为tuple的TopicPartition
我相信有一个简单的方法可以做到这一点,但是对于我一生来说,我似乎找不到出路。而且我还认为我根本不需要暂停Consumer_1。
有人可以帮忙吗?
请注意,这是我创建consumer_1和consumer_2的方式,以防万一。
consumer_1 = KafkaConsumer('one',
group_id='one-group',
bootstrap_servers=['localhost:9092'],
value_deserializer=lambda x: loads(x.decode('utf-8')))
consumer_2 = KafkaConsumer('two',
group_id='two-group',
bootstrap_servers=['localhost:9092'],
value_deserializer=lambda x: loads(x.decode('utf-8')))