簡體   English   中英

使用春季卡夫卡消費者的卡夫卡穩定集團

[英]kafka restabilizing group using spring kafka consumer

我的用戶使用速度很慢,可能需要5分鍾以上才能處理記錄。 我要避免的是讓卡夫卡重新建立團隊。 為了實現此目的,我必須將以下屬性設置為kafka經紀人:

  group.max.session.timeout.ms = 3600001 
  group.min.session.timeout.ms = 3600000

在我的應用程序端,我有以下配置:

    @Bean
      public Map<String, Object> consumerConfigs() {
        final Map<String, Object> propsMap = new HashMap<>();
        propsMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
            environment.getProperty("app.kafkaBrokers"));
        propsMap.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true);
        propsMap.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "100");
        propsMap.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, Integer.valueOf(environment.getProperty("app.session.timeout.ms")) );
        propsMap.put(ConsumerConfig.REQUEST_TIMEOUT_MS_CONFIG, Integer.valueOf(environment.getProperty("app.session.timeout.ms")) + 1 );
        propsMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        propsMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        propsMap.put(ConsumerConfig.GROUP_ID_CONFIG, "group1");
        propsMap.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
        return propsMap;
      }

@Bean
  KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory() {
    final ConcurrentKafkaListenerContainerFactory<String, String> factory =
        new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(consumerFactory());
    factory.setConcurrency(9);// was 3
    factory.getContainerProperties().setPollTimeout(3000);
    return factory;
  }

而且在我的聽眾中,我有:

 @KafkaListener(id = "baz", topics = "tipJobsForExecution", containerFactory="kafkaListenerContainerFactory")
  public void listen(ConsumerRecord<?, ?> record)

我的聽眾需要大約5分鍾來處理消息。 完成后,我在kafka經紀人那邊閱讀了以下內容:

2018-05-03 10:29:11,210]信息[GroupCoordinator 0]:准備與22代老一代重新平衡組baz(__consumer_offsets-7)(kafka.coordinator.group.GroupCoordinator)

據我了解,kafka認為消費者死亡並重新平衡了群體。 我的問題是為什么會這樣? 我的一個想法是,也許心跳並不是每隔3000ms就會進行一次心跳,但我不知道這會帶來多大的麻煩。

預先感謝,吉安尼斯

您必須了解Kafka使用者的三種超時配置參數。

heartbeat.interval.ms-使用Kafka的群組管理工具時,到達消費者協調員的心跳之間的預期時間。 通常應為會話的1/3超時值默認值-3000毫秒

session.timeout.ms-如果代理在此會話超時之前未收到任何心跳信號,則代理將從該使用者中刪除此使用者並啟動重新平衡。默認值為10000

max.poll.interval.ms-如果在此超時到期前未調用poll(),則認為使用方失敗,該組將重新平衡默認值-300000

在您的情況下,輪詢間隔似乎設置為太低的值。

參考-https: //kafka.apache.org/documentation/#newconsumerconfigs

暫無
暫無

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

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