Для чего использовал Kafka

Ответ

В моих проектах Kafka применялась как бэкбон для асинхронной коммуникации в микросервисной архитектуре. Основные сценарии использования:

1. Обработка событий пользовательских действий

// Producer для отправки событий
$producer = new RdKafkaProducer();
$producer->addBrokers("kafka-broker-1:9092,kafka-broker-2:9092");
$producer->setLogLevel(LOG_DEBUG);

$topic = $producer->newTopic("user-events");
$topic->produce(
    RD_KAFKA_PARTITION_UA, 
    0, 
    json_encode([
        'event_id' => uniqid(),
        'user_id' => $userId,
        'action' => 'purchase',
        'timestamp' => time(),
        'payload' => $orderData
    ])
);
$producer->flush(5000); // Ожидаем отправки

2. Синхронизация данных между сервисами

  • Каталог товаров → Поисковый индекс
  • Профили пользователей → Рекомендательная система
  • Транзакции → Аналитическая платформа

3. Буферизация пиковых нагрузок При резком росте запросов (например, во время распродаж) Kafka выступала буфером, предотвращая падение downstream-сервисов. Consumer'ы обрабатывали сообщения со своей скоростью, а Kafka гарантировала доставку и порядок сообщений в рамках партиции.

4. Реализация CQRS и Event Sourcing В одном проекте мы использовали Kafka как event store, где каждый change-ивент записывался в топик domain-events. Это позволяло реконструировать состояние системы в любой момент времени и строить различные read-модели.

Ответ 18+ 🔞

А, ну ты про Кафку спрашиваешь! Ёпта, хорошая тема. Мы её, эту самую очередь, на проектах впиндюривали как основную жилу для общения между сервисами. Без неё — пиздец, а не архитектура, когда всё синхронно и друг на друга орет.

1. Слежка за тем, что юзеры творят Ну, логично же. Нажал кнопку «купить» — и понеслась. Вместо того чтобы сразу в пять баз данных писать и три API дергать, мы просто плюём событие в топик. И всем похуй, что там дальше — аналитика, нотификации, обновление инвентаря. Каждый сервис свой консьюмер запустил и хавает, когда может.

// Тот самый чувак, который кричит в рупор (Producer)
$producer = new RdKafkaProducer();
$producer->addBrokers("kafka-broker-1:9092,kafka-broker-2:9092");
$producer->setLogLevel(LOG_DEBUG);

$topic = $producer->newTopic("user-events");
$topic->produce(
    RD_KAFKA_PARTITION_UA, 
    0, 
    json_encode([
        'event_id' => uniqid(),
        'user_id' => $userId,
        'action' => 'purchase',
        'timestamp' => time(),
        'payload' => $orderData
    ])
);
$producer->flush(5000); // Стоим, ждём, пока крик долетит

Главное — flush() не забыть, а то наговоришь, а сообщения твои так и останутся в буфере, манда с ушами.

2. Чтоб все сервисы жили дружно и данные у них не расходились Представь: в одном сервисе цена поменялась, а в поисковом индексе — нет. Удивление пиздец у пользователя, когда он найдет одно, а купить предложат по другой цене. Поэтому все изменения летят в Кафку, а оттуда их подбирают поиск, рекомендашки, аналитика. Все синхронно, как часы, хуй с горы не собьёшь.

3. Спасатель от внезапных набегов толпы Чёрные пятницы, распродажи — гомосеки налетели, запросов овердохуища. Бэкенд бы просто накрылся медным тазом, если бы каждый запрос сразу обрабатывать. А так — плюнули событие в топик, и да похуй. Консьюмеры в своём темпе жуют, система не падает. Кафка тут — как надёжный склад, всё примет и нигде не потеряет.

4. Для любителей умных архитектур: CQRS и Event Sourcing Вот это, блядь, было интересно. Каждый чих в системе — событие, и все они пишутся в топик domain-events. Получается такая летопись, как в сказке. Хочешь узнать, что было с заказом №666 полгода назад в 14:32? Пожалуйста, накатывай события с начала времён и получишь точное состояние. А из этих же событий можно впендюрить десять разных читаемых моделей под разные нужды. Гибко, конечно, но и головной боли... ебушки-воробушки.

Короче, без Кафки в микросервисах — как без штанов на улице: вроде идёшь, но доверия ебать ноль, и все на тебя косятся.