Назовите основные плюсы и минусы использования Apache Kafka.

Ответ

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

Плюсы Kafka:

  • Высокая пропускная способность: Способна обрабатывать сотни тысяч или даже миллионы сообщений в секунду.
  • Низкая задержка (Low Latency): Доставка сообщений обычно занимает менее 10 мс.
  • Горизонтальная масштабируемость: Легко масштабируется путем добавления новых брокеров в кластер. Нагрузка распределяется за счет партиций (partitions).
  • Отказоустойчивость и надежность (Durability): Данные реплицируются по нескольким брокерам, что обеспечивает сохранность сообщений даже при выходе из строя одного из узлов.
  • Долговременное хранение: В отличие от традиционных брокеров сообщений, Kafka может хранить сообщения в течение длительного времени (дни, месяцы или вечно).
  • Экосистема: Имеет богатую экосистему, включая Kafka Streams и ksqlDB для потоковой обработки, а также множество коннекторов (Kafka Connect).

Минусы Kafka:

  • Сложность в настройке и эксплуатации: Требует глубокого понимания для правильной конфигурации, мониторинга и обслуживания кластера.
  • Зависимость от Zookeeper (в прошлом): Исторически для координации кластера требовался Apache Zookeeper. В новых версиях (с KIP-500, стабильно с версии 3.3.1) эта зависимость устранена благодаря режиму KRaft, что упрощает развертывание.
  • Отсутствие встроенной валидации схем: Для контроля структуры сообщений требуется внешний инструмент, такой как Confluent Schema Registry, для управления схемами (например, Avro, Protobuf, JSON Schema).
  • Ограниченные возможности запросов: Kafka не является базой данных и не предназначена для сложных запросов по содержимому сообщений.
// Пример отправки сообщения в Kafka на Go с использованием библиотеки sarama
package main

import (
    "fmt"
    "log"

    "github.com/IBM/sarama"
)

func main() {
    // Настройка продюсера
    config := sarama.NewConfig()
    config.Producer.Return.Successes = true
    producer, err := sarama.NewSyncProducer([]string{"localhost:9092"}, config)
    if err != nil {
        log.Fatalln("Failed to start Sarama producer:", err)
    }
    defer producer.Close()

    // Создание сообщения
    msg := &sarama.ProducerMessage{
        Topic: "test-topic",
        Value: sarama.StringEncoder("Hello Kafka from Go!"),
    }

    // Отправка сообщения
    partition, offset, err := producer.SendMessage(msg)
    if err != nil {
        log.Printf("FAILED to send message: %sn", err)
    } else {
        fmt.Printf("Message sent to partition %d at offset %dn", partition, offset)
    }
}

Ответ 18+ 🔞

Так, слушай, вот есть у нас эта штука — Apache Kafka. Представь себе, блядь, гигантскую, раздолбанную по всему миру трубу, куда с одного конца суют сообщения, а с другого — их выгребают. И всё это летит с такой скоростью, что мама не горюй.

Чем она, сука, хороша:

  • Жрёт всё подряд: Может заглотить и переварить сотни тысяч, а то и миллионы сообщений в секунду. Овердохуища, да?
  • Быстрая как чёрт: Сообщение долетает от одного конца до другого быстрее, чем ты успеешь сказать «ёпта» — обычно меньше 10 миллисекунд.
  • Растёт как на дрожжах: Захлебнулся? Добавь ещё серверов-брокеров в кластер, и всё, поехали дальше. Вся нагрузка умно раскидывается по этим… как их… партициям.
  • Не убьёшь: Данные копируются на несколько машин, так что если одна накроется медным тазом — всем похуй, остальные работают. Сообщения не теряются.
  • Помнит всё: В отличие от кучи других систем, которые сообщения сожрали и забыли, эта может хранить их днями, месяцами, да хоть вечно. Архив, блядь.
  • Целая куча приблуд: Вокруг неё выросла целая экосистема: Kafka Streams для обработки потоков, ksqlDB для запросов, куча коннекторов (Kafka Connect) чтобы цепляться к чему угодно.

А теперь, блядь, ложка дёгтя:

  • Геморрой настройки: Чтобы эта махина летала, её надо правильно собрать, настроить и постоянно за ней следить. Без понимания, что ты делаешь, получится пиздец, а не кластер.
  • Раньше был Zookeeper: Раньше, сука, нужен был ещё отдельный зверь — Apache Zookeeper, чтобы всеми рулил. В новых версиях (начиная где-то с 3.3.1) от него потихоньку избавляются (режим KRaft), что, конечно, облегчает жизнь.
  • Сама не проверяет: Кинул ты в неё сообщение — а там хер пойми что, хоть стихи. Чтобы следить за структурой данных (схемами), нужны внешние костыли вроде Confluent Schema Registry.
  • Не база данных, ебанашка: Нельзя прийти и спросить: «Эй, Кафка, покажи мне все сообщения, где пользователь „Вася“ купил синий свитер». Для этого она не предназначена. Она — труба, а не склад с каталогом.
// Вот как, блядь, отправить сообщение в эту трубу на Go (используем библиотеку sarama)
package main

import (
    "fmt"
    "log"

    "github.com/IBM/sarama"
)

func main() {
    // Настраиваем отправителя (продюсера)
    config := sarama.NewConfig()
    config.Producer.Return.Successes = true
    producer, err := sarama.NewSyncProducer([]string{"localhost:9092"}, config)
    if err != nil {
        log.Fatalln("Не, чувак, продюсер не запустился:", err)
    }
    defer producer.Close()

    // Лепим само сообщение
    msg := &sarama.ProducerMessage{
        Topic: "test-topic", // В какую тему швыряем
        Value: sarama.StringEncoder("Привет, Кафка, от Go!"), // Сама суть
    }

    // Швыряем!
    partition, offset, err := producer.SendMessage(msg)
    if err != nil {
        log.Printf("Бля, не отправилось: %sn", err)
    } else {
        fmt.Printf("Улетело! Партиция: %d, смещение (offset): %dn", partition, offset)
    }
}