聆听单个消费者的多个主题

时间:2020-01-23 10:11:18

标签: java spring-boot apache-kafka

我最近开始研究Apache Kafka。我不断在各种博客上看到的一件事是,将多个主题配置为同一侦听器。

我的问题是,这样做是一种好习惯吗? 假设我们每个主题每秒收到100条消息。来自每个主题的消息需要不同的自定义。和消息。各个主题进入各自的表格。示例:来自topic1的消息进入topic_1表。

这是我正在开发的Spring Boot应用程序。我也想知道今后我可能还会面临哪些其他挑战。

更新:代码示例

@KafkaListener(topics = "#{'${kafka-consumer.topics}'.split(',')}", groupId = "${kafka-consumer.groupId}")
    public void consume(KafkaConsumer<String, String> record) {
        int count = 0;
        ConsumerRecords<String, String> records = record.poll(1000);
        for (ConsumerRecord<String, String> data : records) {
            System.out.println(data.value());
            count++;
        }
        //record.listTopics()
        if(count > 0){
            record.commitAsync();
        }

    }

2 个答案:

答案 0 :(得分:1)

我的问题是,这样做是一种好习惯吗?

这取决于用例。在您的示例中,一个主题与一个表相关联,您可能应该为每个主题拥有一个使用者,因为如果您的使用者正在从许多不相关的主题中消费,那么消费将会减慢。消费的效率低于生产效率,因此最常见的用例是将您的主题划分为多个分区,每个主题有多个使用者。

如果多个主题相关,那么从多个主题中消费是有意义的。在一个用例中,Confluent撰写了一份白皮书,说明它们在数据中心之间复制数据的位置,并且主题以数据中心ID为前缀。然后,消费者从所有主题中使用名称匹配但数据中心ID不同的商品。

答案 1 :(得分:0)

这完全不是一个好习惯!因为明显的原因,它大大降低了消费率...

,但是在某些情况下,如果您有许多可以动态生成的生产者,并且您希望保留每个生产者的数据消耗,但又具有将数据发送到生产者的能力,则必须使用它。特定设备

例如

很多传感器,每个传感器发送给它自己的主题,其ID如outgoing/12445646之类的

所有这些传感器的数据使用者将收听outgoing/*主题,但仍然可以像incoming/12445646这样在频道上直接向该传感器发送消息

在流量控制的情况下,单独的传出通道非常方便,在该情况下,可以为高吞吐量通道和类似场景生成专用的使用者,或者处理特定的设备而不影响其余设备