Что является первичным ключом для оффсета в Apache Kafka?

«Что является первичным ключом для оффсета в Apache Kafka?» — вопрос из категории Потоковая обработка и Kafka, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Apache Kafka не существует единого "первичного ключа" для оффсета в классическом смысле СУБД. Оффсет однозначно идентифицируется комбинацией трех элементов:

  1. Топик (Topic)
  2. Партиция (Partition)
  3. Группа потребителей (Consumer Group)

Как это работает:

  • Каждое сообщение в партиции топика имеет монотонно возрастающий порядковый номер — это его оффсет в рамках этой партиции.
  • Потребитель (в составе группы) читает данные из одной или нескольких партиций.
  • Для каждой партиции, которую обрабатывает потребитель, группа хранит последний успешно обработанный оффсет. Это состояние (commit) сохраняется во внутреннем топике __consumer_offsets.

Ключ записи в __consumer_offsets:

[group_id, topic, partition] -> offset_metadata

Таким образом, чтобы найти позицию (оффсет) для конкретного потребителя, система использует тройку (group_id, topic, partition) в качестве составного ключа.

Пример:

  • Топик: user-events
  • Партиция: 3
  • Группа потребителей: notification-service
  • Последний коммит: offset 1452

Запись в __consumer_offsets будет иметь ключ ["notification-service", "user-events", 3] и значение 1452. Когда потребитель из группы notification-service перезапустится, он запросит по этому ключу сохраненный оффсет и продолжит чтение партиции 3 топика user-events с сообщения 1453.

Важно: Разные группы потребителей хранят свои оффсеты независимо. Группа analytics-service будет иметь свою собственную запись для той же пары [topic, partition].