Может ли монолитное приложение взаимодействовать с Apache Kafka?

«Может ли монолитное приложение взаимодействовать с Apache Kafka?» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, безусловно. Apache Kafka — это распределённый брокер сообщений, и любое приложение, способное работать по сетевому протоколу, может быть продюсером или консьюмером. Архитектура приложения (монолит или микросервисы) не является ограничением для интеграции с Kafka.

Практические аспекты:

  1. Интеграция: Монолит подключает клиентскую библиотеку Kafka (например, kafka-clients для Java) и взаимодействует с кластером Kafka через брокеры.
  2. Пример продюсера (Java):

    Properties props = new Properties();
    props.put("bootstrap.servers", "localhost:9092");
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    
    try (Producer<String, String> producer = new KafkaProducer<>(props)) {
        producer.send(new ProducerRecord<>("orders", "order-123", "{...}"));
    }
  3. Пример консьюмера (Java):

    Properties props = new Properties();
    props.put("bootstrap.servers", "localhost:9092");
    props.put("group.id", "monolith-service");
    props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    
    try (Consumer<String, String> consumer = new KafkaConsumer<>(props)) {
        consumer.subscribe(List.of("notifications"));
        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
            for (ConsumerRecord<String, String> record : records) {
                // Обработка сообщения
                System.out.println("Received: " + record.value());
            }
        }
    }

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