【问题标题】:Consuming Kafka Messages in Spring在 Spring 中消费 Kafka 消息
【发布时间】:2018-06-10 07:23:47
【问题描述】:

通过关注tutorial,我能够创建一个简单的生产者-消费者示例。在我的示例中,只有 1 个主题,而我正在听那个主题。因此,ReceiverConfig 中的代码是有意义的。特别是围绕GROUP_ID_CONFIG 的点,即我创建主题topic_name,然后在此配置中对其进行配置。现在我的问题是,如果我有超过 1 个主题怎么办。假设我有topic_1、topic_2 等等?我应该为每个单独的主题创建ReceiverConfig 吗?

@EnableKafka
@Configuration
public class ReceiverConfig {
    @Value("${spring.kafka.bootstrap-servers}")
    private String bootstrapServers;

    @Bean
    public Map<String, Object> consumerConfigs() {
        Map<String, Object> props = new HashMap<>();
        props.put(BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(GROUP_ID_CONFIG, "topic_name");
        props.put(AUTO_OFFSET_RESET_CONFIG, "earliest");

        return props;
    }

    @Bean
    public ConsumerFactory<String, String> consumerFactory() {
        return new DefaultKafkaConsumerFactory<>(consumerConfigs());
    }

    @Bean
    public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory() {
        ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerFactory());
        return factory;
    }
}

【问题讨论】:

    标签: spring-boot apache-kafka


    【解决方案1】:

    简短的回答是否定的,您不需要为每个主题创建多个配置。

    在继续之前,我认为最好指定 groupId 是 Consumer 进程所属的组,而 topic 将被 Consumer 进程消费是两个不同的东西。

    通过下面的句子,您将告诉消费者它属于 topic_name 组,仅此而已。

    props.put(GROUP_ID_CONFIG, "topic_name");
    

    如果您希望消费者从多个主题读取数据,有一个subscribe 方法接收一个集合作为参数,这样您就可以指定所有主题来读取数据,而无需为每个主题创建新配置话题。

    请查看这个例子,你会看到我提到的方法

    // Subscribe to the topic.
    consumer.subscribe(Collections.singletonList(TOPIC));
    

    【讨论】:

    • 谢谢,但是如果我想在不同的接收器中接收每条消息怎么办?所以消息将被发送到topic_1,topicOneReceiver 应该接收到......发送到topic_2 的消息应该由topicTwoReceiver 接收。我实际上有这个更改的工作副本,但我只是想确保我正确实施它。
    • 从逻辑的角度来看,使用topicOneReceiver 和topicTwoReceiver 有什么区别?我看不出使用 2 个不同的接收器的意义。
    • topicOneReceiver 有自己的业务实现。假设如果它从主题中接收到一个数字,它将乘以 2。topicTwoReceiver 将有不同的实现。例如,根据传入的值,它将从常量中减去该值。
    • 到目前为止,我已经创建了单独的接收器和单独的主题。这是不可扩展的,即,如果我添加更多主题,我必须添加更多类。所以想知道什么是最好的 eya
    • 记住要消费的topic是ConsumerRecord的一部分,这样你就可以根据你的消息记录所属的topic有不同的逻辑。根据您的用例,我将使用相同的接收器(我会为了心理健康而更改组名),并且我会开始使用来自不同主题的数据。之后,我将开始水平扩展,将更多的消费者添加到组和来自多个分区的消费者。 kafka.apache.org/0102/javadoc/org/apache/kafka/clients/consumer/…
    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2016-11-11
    • 2016-12-27
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多