簡體   English   中英

在同一個 Kafka 主題中監聽多種類型的對象

[英]Listen to multiple type of objects in the same Kafka topic

我有一個用例,我將在同一主題中接收兩種 object。 我面臨的問題是所有的對象都去同一個聽眾。 未使用第二個偵聽器。

我的聽眾類似於下面

@EnableKafka
@Service
public class consumerService {

  @KafkaListener(topic = "t", groupId = "g" containerFactory = "fooContainerFactory")
  public void consume1(Foo foo) {
     logger.info("I got : " + foo);
  }

  @KafkaListener(topic = "t", groupId = "g" containerFactory = "barContainerFactory")
  public void consume2(Bar bar) {
     logger.info("I got : " + bar);
  }

}

Foo 的容器工廠在下面,我有一個類似的 Bar。

@Configuration
public class MyConsumerConfig {


  @Value(value = "${kafka.bootstrapAddress}")
  private String bootstrapAddress;

  @Value(value = "${group.id}")
  private String groupId;

  public Map<String, Object> clickConsumerFactory() {
    /** Set the consumer properties here */
    Map<String, Object> props = new HashMap<>();
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress);
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
    props.put(JsonDeserializer.TRUSTED_PACKAGES, "*");
    return props;
  }

  @Bean
  public ConcurrentKafkaListenerContainerFactory<String, Foo> clickKafkaListenerContainerFactory() {
    /** Listener factory for the class 'Foo' */
    ConcurrentKafkaListenerContainerFactory<String, Foo> factory
            = new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(new DefaultKafkaConsumerFactory<>(clickConsumerFactory()));
    factory.setMessageConverter(new StringJsonMessageConverter());
    factory.setErrorHandler(((exception, data) -> LOGGER.info("There was an error " + exception)));
    return factory;
  }
}

我嘗試使用 KafkaHandler,但我不知道如何指定單個容器工廠(對於 Foo:FooContainerFactory,對於 Bar:BarContainerFactory)我被困了幾個小時。 有人能告訴我我應該改變什么嗎?

我可能會離開這里。 因為我不確定@KafkaListener 是如何工作的。 但是,在我的腦海中,有可能只有一個分區並且第一個 kakfaListener 被分配給它。 因此,任何新的偵聽器(類似於 kafka 消費者)都不會被分配任何分區,因為開始時只有 1 個分區。 因此,新的偵聽器將閑置等待分配某個分區,以便他們可以開始讀取數據。

您可以通過禁用第一個 KafkaListener 然后運行您的應用程序來驗證這一點。 第二個聽眾會自動加入。

或者,如果您的主題已經有多個分區,則可能由於消息的鍵而發生這種情況,因為鍵可用於將數據發送到一個分區。 並且您的第一個偵聽器被分配給該分區。

你不能那樣做。 如果同一個主題同時包含 Foo 和 Bar 對象; 框架無法過濾掉不匹配的記錄。

而且,正如在其他評論中所說的那樣,答案,因為它們都在同一個組中,所以他們每個人都會得到一個記錄子集。

最簡單的解決方案是使用兩個不同的主題。

如果這不可能,您必須使用帶有@KafkaHandler方法的 class 級別的偵聽器,但是您需要在反序列化器中進行轉換,而不是框架從方法參數中找出類型。

有關顯示如何執行此操作的示例的鏈接,請參閱此答案

暫無
暫無

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

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