Как реализовать упорядочение сообщений в Spring Kafka

#apache-kafka #spring-kafka

#apache-kafka #spring-kafka

Вопрос:

Я использую Spring Kafka для разработки своего проекта. Я использую тему, которая имеет:

partitions : 5

min.insync.replicas: 3

Итак, какие бы сообщения ни отправлял производитель, в том же порядке мне нужно обрабатывать сообщения от потребителя Kafka.

Я просмотрел некоторую документацию, и там было указано, что нам нужно использовать key в producer, чтобы он попал в определенный раздел. Я новичок в Kafka и не уверен, как я это реализую.

Ниже приведены свойства для потребителя Kafka:

  props.put(BOOTSTRAP_SERVERS_CONFIG, bootstrapServer);
 props.put(GROUP_ID_CONFIG, "prj_1");
 props.put(KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
 props.put(VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
 props.put(AUTO_OFFSET_RESET_CONFIG, "latest");
 props.put(ENABLE_AUTO_COMMIT_CONFIG, Boolean.FALSE);
  

И следующий код предназначен для KafkaListener:

 @KafkaListener(topics = "${test.topic}")
public void consume(
  @NotNull final ConsumerRecord<String, String> cr,
  @Payload final String payload,
  final Acknowledgment acknowledgment) {
try{
    final XYZObject xyzObject =
    objectMapper.readValue(payload, XYZObject.class);
    final Response response = processPayload(xyzObject);
    publishResponseToKafka(response, xyzObject);
    log.info(
        "publishResponseToKafka() took ="{}"ms", Duration.between(pblshTime, 
     Instant.now()).toMillis());
  } finally {
     acknowledgment.acknowledge();
  }
 }
  

С нетерпением ждем от вас всех.

Спасибо.

Комментарии:

1. Был дан ответ много раз: порядок потребления не гарантируется для более чем одного раздела. Ключи помогают разделять данные, а не упорядочивать потребление (если вы явно не назначаете потребителя для обработки отдельных разделов)

2. Также не ясен ваш вариант использования. Имеют ли XYZ и время T какое-либо отношение к new_XYZ в момент времени T 1? Если нет, действительно ли порядок имеет значение?

3. Спасибо @OneCricketeer XYZ, и время T было частью моего примера. это не связано с моим вопросом. У меня ситуация, когда мне нужно обрабатывать сообщения в том же порядке, в котором они были опубликованы производителем. Итак, если производитель создал, например, msg1, msg2, msg3, msg4 и msg5 в следующем порядке: Создано: msg2 -> msg3 -> msg1 -> msg5 -> msg4, тогда мой потребитель должен получать сообщения в том же порядке: Потребитель: msg2 -> msg3 -> msg1 -> msg5 -> msg4 с учетом5 раздел.

4. Если все они имеют один и тот же ключ, то они вынуждены упорядочиваться таким образом, как указано