Как вы использовали Apache Kafka в проекте?

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

Ответ

Apache Kafka использовался как высокопроизводительный распределенный брокер событий (event bus) для асинхронной связи между микросервисами.

Типичный use case: Система уведомлений. Сервис-источник (например, order-service) публикует событие OrderCreated, а сервис-потребитель notification-service обрабатывает его и отправляет email.

Пример продюсера на Java:

Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-broker1:9092,kafka-broker2:9092");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class.getName()); // Для JSON

try (Producer<String, OrderEvent> producer = new KafkaProducer<>(props)) {
    OrderEvent event = new OrderEvent(orderId, "CREATED");
    ProducerRecord<String, OrderEvent> record = 
        new ProducerRecord<>("order-events", orderId.toString(), event);
    producer.send(record); // Асинхронная отправка
}

Пример консьюмера (Spring Kafka):

@Component
public class NotificationConsumer {
    @KafkaListener(topics = "order-events", groupId = "notification-group")
    public void handleOrderEvent(OrderEvent event) {
        // Логика отправки уведомления
        sendEmail(event.getOrderId(), event.getStatus());
    }
}

Почему Kafka?

  • Высокая пропускная способность и низкая задержка.
  • Надежность: Сообщения сохраняются на диске и реплицируются.
  • Масштабируемость: Легко добавлять партиции топика и новых консьюмеров.
  • Потоковая обработка: Возможность использовать Kafka Streams для real-time агрегации.