Что такое топик (topic) в Apache Kafka?

Ответ

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

Ключевые характеристики топика:

  • Партиционирование: Каждый топик делится на одну или несколько партиций. Это основа масштабируемости Kafka: разные партиции одного топика могут размещаться на разных брокерах, позволяя параллельно записывать и читать данные.
  • Неизменяемость и порядок: Сообщения, записанные в партицию, являются неизменяемыми. Внутри одной партиции порядок сообщений гарантируется и каждое сообщение имеет уникальный, монотонно возрастающий идентификатор — offset.
  • Репликация: Каждая партиция реплицируется на несколько брокеров (задается replication-factor). Одна реплика является лидером (leader) для операций записи/чтения, остальные — последователями (followers) для отказоустойчивости.

Пример работы:

# Создание топика с 3 партициями и фактором репликации 2
kafka-topics.sh --create 
  --topic user-events 
  --partitions 3 
  --replication-factor 2 
  --bootstrap-server localhost:9092

# Запись сообщения в топик
kafka-console-producer.sh --topic user-events --bootstrap-server localhost:9092
> {"userId": 123, "action": "login"}

# Чтение сообщений с начала топика
kafka-console-consumer.sh --topic user-events --from-beginning --bootstrap-server localhost:9092

На практике мы проектируем топики вокруг бизнес-событий (например, orders, payments, user-tracking). Выбор количества партиций — это баланс между параллелизмом (больше партиций = больше параллельных потребителей) и накладными расходами.

Ответ 18+ 🔞

А, ну вот, объясняю про топики в Кафке, чтобы ты не ходил, как манда с ушами, и не путал их с очередями из какого-нибудь древнего RabbitMQ.

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

Что там у него внутри, под капотом:

  • Партиционирование: Вот тут начинается магия. Каждый топик можно нарезать на партиции. Это, блядь, основа всей масштабируемости! Разные партиции одного топика могут валяться на разных серверах (брокерах), и запись с чтением идут параллельно. Овердохуища производительности, если правильно настроить.
  • Неизменяемость и порядок: Сообщение, которое улетело в партицию, назад не вытащишь — оно там навечно. Но зато внутри одной партиции порядок гарантирован железно. Каждое сообщение получает свой уникальный, монотонно растущий номер — offset. Это как номерок в очереди, только очередь бесконечная.
  • Репликация: Чтобы всё не накрылось медным тазом, если один сервер сдохнет, каждая партиция копируется на несколько брокеров (задаётся replication-factor). Одна реплика — лидер, она принимает весь удар, остальные — последователи, которые её подстраховывают. Отказоустойчивость, ёпта.

Как это выглядит на практике, на пальцах:

# Создаём топик 'user-events' на три партиции, с двумя копиями каждой.
kafka-topics.sh --create 
  --topic user-events 
  --partitions 3 
  --replication-factor 2 
  --bootstrap-server localhost:9092

# Пишем в него сообщение (производитель)
kafka-console-producer.sh --topic user-events --bootstrap-server localhost:9092
> {"userId": 123, "action": "login"}

# Читаем всё с самого начала (потребитель)
kafka-console-consumer.sh --topic user-events --from-beginning --bootstrap-server localhost:9092

А по жизни мы создаём топики вокруг бизнес-событий: orders, payments, user-tracking. Выбор количества партиций — это вечный компромисс. Больше партиций — больше параллельных потребителей, выше скорость. Но и накладных расходов тоже больше, система сложнее. Тут надо головой думать, а не тыкать наугад.