【问题标题】:Consuming from kafka topic using spring only on receiving certain events仅在接收某些事件时才使用 spring 从 kafka 主题中消费
【发布时间】:2019-06-04 18:50:45
【问题描述】:

我在我的 Spring Boot 应用程序中创建了一个 kafka 消费者,它监听一个主题 - my_topic 并在读取事件 my_event 时执行一些操作。现在我正在这样做:

@KafkaListener(topics = "my_topic",
          containerFactory = "my_kafka_container_factory")
public void handleMyKafkaEvents(String eventJson) {
    MyDTO my_dto = gson.fromJson(eventJson, MyDTO.class);
    String event_type = my_dto.getEventType();
    if (event_type != null && event_type.equals("my_event")) {
        // do something with my_dto
    }
}

// dto object
public class MyDTO {
    private String status;

    private String eventType;

    private String propName;

    // some other parameters

    // getters and setters
}

我的 kafka 主题中的对象的样例:

{
  "eventType": "my_event",
  "propName": "prop_value",
  "status": "DONE",
  //some_other_key_value_pairs_required_in_my_DTO
  //some_other_key_value_pairs_not_required_in_my_DTO
}

由于我的侦听器正在侦听推送到 kafka 主题的所有数据,因此我必须在读取每条记录后添加一个条件,如果它的 eventType 是我需要的,那么我正在对其执行一些操作。

目前正在运行。由于会有其他数据推送到它的 eventType 不是我需要的,这些将被忽略,但只有在阅读它们之后,因为我不知道如何根据这个 eventType 进行过滤。

所以我的问题是,当推送到 kafka 主题的事件数量突然激增时,不仅是我的 eventType,还有其他事件,它会影响我的服务性能吗?

我可以在这里改进什么,以便忽略其他事件类型,我的听众甚至不必知道它们。

【问题讨论】:

  • 肯定会“影响性能”,毕竟你是在做事。例如,您可以为每个事件类型创建一个主题。
  • 是的,我知道它会影响我的服务,我的问题是我如何才能在到达我的服务之前过滤掉不必要的事件。
  • 您可以使用 Kafka 流先过滤,然后处理。您必须为过滤结果创建另一个主题,我不确定它实际上是否更高效。如果没有,至少您可以在上游的单独服务中执行此操作并根据您的需要进行扩展。

标签: java spring-boot apache-kafka spring-kafka


【解决方案1】:

有些方法可能适合或不适合您的用例,但可能会有所帮助:

  • 在密钥中包含掩码

在 kafka key 中包含一些特定代码,因此您无需阅读 payload 即可判断是否必须处理该消息。

只是一个愚蠢的例子:

key      payload
-----------------
10_ev  xxx
08_ev  yyy
...

在这个简单的例子中,前两个数字决定了事件的类型。每个消费者组都被分配一个特定的事件来处理,并丢弃其他的。 小心!为此,您需要启动与您拥有的事件类型一样多的消费者组,因此不会丢失任何消息,或者将特定范围的事件分配给所有消费者(例如,消费者 0 处理 0-9 的事件类型, 10-19 岁的消费者 1,...)

  • 分区取决于事件

您可以告诉生产者(应该知道他正在生产的事件类型的人)对消息进行分区(将消息发送到主题中的特定分区),例如,您知道所有 事件类型 0 位于 partition 0 上,并牢记这一点。

无论如何,有太多的事件类型可能会减少它的选项可用。您可以根据范围进行分区(分区 0 上从 0 到 9 的事件类型等),但是,也许那里有些令人头疼。

  • 根据事件类型发送到不同的主题

嗯,这肯定是最简单的一个,但如果您有很多事件类型(如数千,...),则可能会成为问题。 :)

希望对您有所帮助。关于您的用例here,有一些有趣的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    相关资源
    最近更新 更多