如果将group_id设置为None,则Kafka使用者会收到消息,但如果不是None,它不会收到任何消息吗?

时间:2020-11-07 00:32:15

标签: python apache-kafka kafka-consumer-api kafka-python

我有以下Kafka用户,如果将group_id分配为None,它将很好地工作-它接收了所有历史消息和新测试的消息。

consumer = KafkaConsumer(
        topic,
        bootstrap_servers=bootstrap_servers,
        auto_offset_reset=auto_offset_reset,
        enable_auto_commit=enable_auto_commit,
        group_id=group_id,
        value_deserializer=lambda x: json.loads(x.decode('utf-8'))
    )

for m in consumer:

但是,如果我将group_id设置为某个值,它什么也不会收到。我试图运行测试生产者来发送新消息,但什么也没收到。

使用者控制台确实显示以下消息:

2020-11-07 00:56:01 INFO     ThreadPoolExecutor-0_0 base.py (Re-)joining group my_group
2020-11-07 00:56:07 INFO     ThreadPoolExecutor-0_0 base.py Successfully joined group my_group with generation 497
2020-11-07 00:56:07 INFO     ThreadPoolExecutor-0_0 subscription_state.py Updated partition assignment: []
2020-11-07 00:56:07 INFO     ThreadPoolExecutor-0_0 consumer.py Setting newly assigned partitions set() for group my_group

2 个答案:

答案 0 :(得分:2)

主题的一个分区只能由同一ConsumerGroup中的一个使用者使用。

如果您未设置group.id,KafkaConsumer将为您生成一个新的随机group.id。由于此group.id是唯一的,您将看到数据正在消耗。

如果您有多个使用同一group.id的使用者,则只有一个使用者将读取数据,而另一个则保持空闲状态而不消耗任何东西。

答案 1 :(得分:0)

我知道,这不是作者问题的解决方案。不过,如果您来到这里,您可能会因为另一个原因而遇到此问题。和我一样。

所以,至少对于 kafka-python v2.0.2 和 Aiven Kafka broker 设置,问题是通过添加消费者.poll() 的干调用解决的。 这特别奇怪,因为当没有分配 group_id 时,这不是必需的。

输出:

columnfiltertext = "bmc";
jQuery.ajax({
    url: "https://********.com/wp-content/themes/oceanwp/database-table-data.php", 
    method: "post", 
    //data: { "message":$('#input-message').val(),"sender":$('#sender').val(),"receiver":$('#receiver').val()},you can pass the values directly like this or else you can store it in variables and can pass
    data: { filtertext: "bmc" }, //"column_filter_number":column_filter_number},
    success: function(response){
            var len = response.length;
            for(var i=0; i<len; i++){
                var filter_column_data = response[i].filter_column_data;
                //alert(filter_column_data);
                console.log(i + ":" + filter_column_data);
                }
        },
     error: function() {
    alert('Not OKay');
    } 
   });
});
});

在这种情况下什么都没有

虽然下面按预期工作。它只读取来自上次 commit() 的新消息:

输出:

def get():
    for message in consumer:
        print(message.value)
    consumer.commit()

它按预期输出自上次提交以来该主题中的所有消息

JFYI,类构造函数看起来像这样:

def get():
    consumer.poll()
    for message in consumer:
        print(message.value)
    consumer.commit()

¯\_(ツ)_/¯

相关问题