Kafka: топики, партиции, offset, consumer groups

↑ 5.4 Очереди и брокеры: Kafka, RabbitMQ · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Основа Kafka: партиции определяют порядок и параллелизм. Это спрашивают всегда.

Объяснение

Kafka — распределённый журнал событий (commit log). Сообщения хранятся на диске заданное время и могут читаться многократно.

ПонятиеСмысл
Topicименованный поток сообщений
Partitionупорядоченный неизменяемый лог; единица параллелизма и масштабирования
Offsetпорядковый номер сообщения в партиции
Keyключ сообщения: одинаковые ключи попадают в одну партицию
Broker / Clusterсерверы Kafka
Replication factorчисло копий партиции (leader + followers)
Consumer groupнабор потребителей, делящих партиции топика
Retentionсколько хранить (время/размер) или compaction
flowchart LR
  P[Producer] -->|key=order-1| T
  subgraph T[Topic orders, 3 партиции]
    P0[part 0]
    P1[part 1]
    P2[part 2]
  end
  P0 --> C1[Consumer A]
  P1 --> C2[Consumer B]
  P2 --> C2

Правила:

  • Порядок гарантируется только внутри партиции. Для порядка событий одного заказа используйте key = orderId.
  • В группе одну партицию читает один потребитель; потребителей больше, чем партиций, — лишние простаивают.
  • Разные группы читают независимо (каждая со своим offset): так работает pub/sub.
  • Offset коммитится потребителем: после коммита при перезапуске чтение продолжится с этого места.
  • Rebalance: при изменении состава группы партиции перераспределяются (на время чтение останавливается).

Нюансы и подводные камни

  • Число партиций сложно уменьшить, а рост меняет распределение ключей: закладывайте с запасом.
  • «Горячий ключ» перегружает одну партицию.
  • Слишком много партиций → нагрузка на брокеры и долгий rebalance.
  • Log compaction хранит последнее значение по ключу (для «состояния»).
  • Retention удаляет старые данные независимо от того, прочитаны они или нет.

Практика

  1. Создайте топик из 3 партиций, отправьте сообщения с разными ключами, посмотрите распределение.
  2. Запустите двух потребителей в группе и наблюдайте rebalance.
  3. Сбросьте offset группы и перечитайте историю (kafka-consumer-groups).

Вопросы с ответами

Связанные темы