Ответ
В Apache Kafka не существует единого "первичного ключа" для оффсета в классическом смысле СУБД. Оффсет однозначно идентифицируется комбинацией трех элементов:
- Топик (Topic)
- Партиция (Partition)
- Группа потребителей (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].