簡體   English   中英

卡夫卡從主題中讀取新舊價值

[英]Kafka reading old and new value from topic

我們有一個生產者-消費者環境,我們正在為我們的項目使用 Spring Boot。 使用 class 完成 Kafka 配置

@Configuration
@EnableKafka
public class DefaultKafkaConsumerConfig {

    @Value("${spring.kafka.bootstrap-servers}")
    private String bootstrapServers;

    @Value("${spring.kafka.bootstrap-servers-group}")
    private String bootstrapServersGroup;


    @Bean
    public ConsumerFactory<String,String> consumerDefaultFactory(){
        Map<String, Object> props = new HashMap<>();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, IntegerDeserializer.class);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
     
        props.put(ConsumerConfig.GROUP_ID_CONFIG, bootstrapServersGroup);
        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
        props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true);
     
        return new DefaultKafkaConsumerFactory<>(props);
    }

    @Bean
    public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerDefaultContainerFactory() {
        ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerDefaultFactory());
        return factory;
    }


}

場景:我們正在寫一些關於 Kafka 主題的值。 考慮一下我們有一些要放置實時數據的主題。 其中狀態為“live:0”表示已完成事件,“live:1”表示實時事件。 現在,當事件將要上線時,它將得到更新並寫入主題,並且根據這個主題,我們正在處理事件。

ISSUE :當事件上線時,我從“live:1”主題中讀取數據並進行處理。 但是當事件更新並且主題中的新數據更新時。 現在,當有關主題的新數據更新時,我可以讀取這些數據。 但是有了關於主題的新數據,我也收到了舊數據。 因為在我的事件受到影響的同時,我同時獲得了新舊數據。 有的時候它會上線,有的時候完成。

有人對此提出任何建議嗎? 為什么我會收到已提交的數據和新更新的數據? 我在配置中缺少什么?

您可能需要檢查以下幾件事:-1。 分區數 2. 消費者數

這是否也意味着您正在以新的狀態再次將消費消息重寫到主題?

try {
  ListenableFuture<SendResult<String, String>> futureResult = this.kafkaTemplate.send(topicName, message);
  futureResult.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {

    @Override
    public void onSuccess(SendResult<String, String> result) {
        log.info("Message successfully sent to topic {} with offset {} ", result.getRecordMetadata().topic(), result.getRecordMetadata().offset());
    }

    @Override
    public void onFailure(Throwable ex) {
        FAILMESSAGELOGGER.info("{},{}", topicName, message);
        log.info("Unable to send Message to topic {} due to ", topicName, ex);
    }
      
  });
} catch (Exception e) {
  log.error("Outer Exception occured while sending message  {} to topic {}", new Object[] { message, topicName, e });
  FAILMESSAGELOGGER.info("{},{}", topicName, message);
} 

這就是我們所擁有的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM