Я пытаюсь ввести 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
и передать ему сообщение), то с обработкой ничего не понятно ничего не понятно.
Может быть, есть ли примеры этого, лучшие практики?