Kafka正在检查主题以获取消息

时间:2019-03-18 08:29:30

标签: python-3.x apache-kafka

我有一个可读取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')))

0 个答案:

没有答案