Правильно ли инкапсулировать KafkaTemplate / методы обработки в вашу собственную оболочку (и как)?

#java #oop #design-patterns #spring-kafka #design-principles

#java #ооп #шаблоны проектирования #spring-kafka #принципы проектирования

Вопрос:

Я пытаюсь внедрить в наш проект apache Kafka и изменить архитектуру проектов на producer-consumer. Я экспериментирую над новым тестовым проектом. Например, у меня есть один производитель и два потребителя. Это разные приложения с весенней загрузкой (микросервисы).

В службе producer мне нужно настроить Kafka, создать KafkaTemplate . В каждом потребителе мне нужно настроить Kafka и создать обработчики (методы с @KafkaListener аннотацией).

Например, завтра мы захотим заменить Kafka на что-то другое, мы изменим KafkaTemplate методы and с @KafkaListener аннотацией на реализацию новой библиотеки. Это не очень хороший подход. Итак, я считаю, что нам нужно создать нашу оболочку. Что-то вроде этого:

 public interface EventBus {
    void sendMessage(String topicName, String message);
}
  

И инкапсулируйте KafkaTemplate в реализацию этого интерфейса ( KafkaEventBus implements EventBus )

Я начинаю это реализовывать, но столкнулся с тем, что не понимаю, как это сделать. Я создаю модуль Gradle с именем ‘event-bus’. Этот модуль не spring — просто Java-модуль. Я создаю EventBus интерфейс и внедряю его:

 public class KafkaEventBus implements EventBus {

    private final KafkaProducer<String, String> kafkaProducer;

    public KafkaEventBus() {
        this.kafkaProducer = new KafkaProducer<>(producerConfig());
    }

    @Override
    public void sendMessage(String topicName, String message) {
        kafkaProducer.send(new ProducerRecord<>(topicName,message));
    }

    private Map<String, Object> producerConfig() {
        Map<String, Object> configProps = new HashMap<>();
        configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        return configProps;
    }
}
  

И застрял. У меня есть вопросы:

1) Нужно ли мне создавать другой модуль (event-bus)? Правильно ли я думаю?

2) Как можно реализовать обработку сообщений в этом модуле? Если отправка чего-либо понятна (инкапсулировать KafkaTemplate и делегировать ему сообщение), то с обработкой ничего не понятно ничего не ясно.

Может быть, есть какие-нибудь примеры этого, лучшие практики?