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

Ответ

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 агрегации.

Ответ 18+ 🔞

Да ты посмотри, какой зверь этот Apache Kafka! Это ж не просто брокер, это, блядь, настоящий монстр для передачи событий между микросервисами, как по магической трубе, только асинхронно и с гарантиями, что ни одна хуйня не потеряется.

Вот тебе классика жанра, прямо в точку: Система уведомлений. Один сервис, допустим, по заказам, создал заказ и такой: "О, слушай, я тут событие OrderCreated сгенерил, держи!" А другой сервис, по уведомлениям, уже дежурит, подхватывает эту радость и — бац! — письмо пользователю на почту. Красота, ёпта!

Смотри, как продюсер на 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 можно в реальном времени данные агрегировать, трансформировать — вообще, волшебство, а не инструмент.