【问题标题】:How to configure Kafka to behave like a FiFo queue?如何将 Kafka 配置为像 FiFo 队列一样工作?
【发布时间】:2020-10-08 12:44:15
【问题描述】:

我有一个小问题,那就是我必须使用 kafka 作为通知系统来启动我的应用程序的流程,一切都很好,但我想知道是否可以在有未读消息时更改顺序在队列中。

让我解释一下:当主题中有两条或更多条消息,并且消费者阅读它们时,首先阅读,最后一个进入,我希望它首先阅读,第一个进入。

所以我想知道这是否可行,如果可行,我们必须为此做出改变。

我正在使用最新版本的 Spring Apache 和 Kafka 2.5.0

消费者配置:

@EnableKafka
@Configuration
public class KafkaConsumerConfig {

    private static final String BOOTSTRAP_ADDRESS = "";

    @Bean
    public ConsumerFactory<String, String> consumerFactory() {
        Map<String, Object> props = new HashMap<>();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_ADDRESS);
        props.put(ConsumerConfig.GROUP_ID_CONFIG, "id");
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        return new DefaultKafkaConsumerFactory<>(props);
    }


    @Bean
    public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {

        ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerFactory());
        return factory;
    }
}


Kafka消费者:


@Component
public class KafkaConsumer {

    @KafkaListener(topics = "Great_Topic")
    private void listen(String msg) {
        System.out.println("I've received: " + msg);
    }
}


例子:

在我的生产者中,我按此顺序发送了以下消息:

  • Hello World 1
  • 你好世界 2

消费者的输出:

  • 你好世界 2
  • Hello World 1

我希望输出与输入具有相同的顺序。

【问题讨论】:

  • 这是不可能的。
  • 哇,我希望它可以,我觉得很奇怪,看起来如此简单的事情在 kafka 中却无法完成。 @sonus21
  • 有些系统是针对特定用例设计的,队列是为了使用堆栈。
  • 在您引用的示例中,您是观察到行为,还是期望行为?
  • 示例是观察到的行为@RobinMoffatt

标签: java spring apache-kafka


【解决方案1】:

当你从一个主题消费时,你可以选择从头开始阅读,当你这样做时,你会得到所有的消息按照它们在分区中产生的顺序

如果您只有一个分区您将获得严格的 FIFO 行为

如果您有多个分区(就像您在这里一样),那么您会在一个分区内获得 FIFO,但跨分区它将是不确定的。因此,您可以获得您展示的行为。

【讨论】:

  • 这个问题发生在消费者关闭,生产者不断发送消息,当我再次激活消息时,它没有FiFo行为,它有LiFo行为
  • PartitionCount:3, ReplicationFactor:2, 主题和服务器都是我公司自己创建的,所以不知道能不能改配置,可能不行。 @罗宾莫法特
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 2018-02-04
  • 1970-01-01
  • 2015-01-26
相关资源
最近更新 更多