Как настроить Kafka, чтобы он работал как очередь FiFo? - PullRequest
0 голосов
/ 18 июня 2020

У меня небольшая проблема, и это то, что мне нужно использовать kafka в качестве системы уведомлений для запуска потоков моего приложения, все в порядке, но я хотел бы знать, могу ли я изменить порядок, когда есть непрочитанные сообщения в очереди.

Позвольте мне объяснить: когда в топи c есть два или более сообщения, и потребитель их читает, сначала прочитайте последнее, которое вошло, и я хочу, чтобы он прочитал сначала первый, который вошел.

Итак, я хотел знать, возможно ли это, и если да, то что мы должны изменить для него.

Я использую последнюю версию Spring Apache и Kafka 2.5.0

ConsumerConfig:

@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;
    }
}


KafkaConsumer:


@Component
public class KafkaConsumer {

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


Пример:

У моего производителя отправил следующие сообщения в этом порядке:

  • Hello World 1
  • Hello World 2

Вывод на потребителе:

  • Hello World 2
  • Hello World 1

Я хочу, чтобы на выходе был тот же порядок, что и ввод.

1 Ответ

2 голосов
/ 18 июня 2020

Когда вы потребляете из топи c, вы можете выбрать чтение с самого начала, и когда вы это сделаете, вы получите все сообщения в том порядке, в котором они были созданы в разделе .

Если у вас один раздел , вы получите строгое поведение FIFO .

Если у вас есть несколько разделов (как, похоже, у вас здесь), тогда вы получаете FIFO внутри раздела, но между разделами он будет недетерминированным c. Таким образом, вы можете добиться того же поведения, которое вы показываете.

...