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

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

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

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

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

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

Я начинаю это реализовывать, но я столкнулся с тем, что не понимаю, каксделай это.Я создаю модуль Gradle с именем 'event-bus'.Этот модуль не весенний - просто 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) Нужно ли создавать другой модуль (шина событий)?Думаю ли я правильно?

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

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

...