Использование темы из кафки с использованием весны только при получении определенных событий - PullRequest
2 голосов
/ 04 июня 2019

Я создал потребителя 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
}

Пример того, как выглядит объект в моей теме кафки:

{
  "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, но и других, повлияет ли это на производительность моего сервиса?

Что я могу улучшить здесь, чтобы другие типы событий игнорировались, и мой слушатель даже не узнал о них.

1 Ответ

2 голосов
/ 04 июня 2019

Некоторые способы, которые могут или не вписываются в ваш вариант использования, но могут помочь:

  • Включить маску в ключ

Включитькакой-то конкретный код в kafka key, поэтому вам не нужно читать payload, чтобы сказать, нужно ли обрабатывать сообщение или нет.

Просто глупый пример:

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

В этом простом примере первые два числа определяют тип события.Каждой группе потребителей назначается определенное событие для обработки, а другие отбрасываются. Осторожно !Чтобы это работало, вам нужно запустить столько групп потребителей, сколько у вас есть типов событий, чтобы ни одно сообщение не было потеряно, или назначить конкретные диапазоны событий всем потребителям (например, потребитель 0 обрабатывает типы событий от 0 до 9, потребитель 1 от 10-19, ...)

  • Разделение в зависимости от события

Вы можете сообщить производителю (тот, кто должен знать тип события, которое он производит) разделить (отправить сообщение определенному разделу в тему) сообщение, чтобы вы знали, например, что все события типа 0 находятся на раздел 0 , и потребляйте это с умом.

В любом случае, слишком большое количество типов событий может уменьшить параметры этого значения до годное к употреблению .Вы можете разделить на основе диапазонов (типы событий от 0-9 для раздела 0 и т. Д.) , но, может быть, там есть какая-то головная боль.

  • Отправить на другойтемы в зависимости от типа события

Ну, этот, безусловно, самый простой, но может быть проблемой, если у вас много типов событий (, например, тысячи, ... ).:)

Надеюсь, это поможет.Здесь есть интересная информация о вашем случае использования здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...