Карта / Kafka / Offset, партиции

Offset, партиции

Партиция — топик физически разбит на несколько частей (партиций), чтобы можно было обрабатывать сообщения параллельно, разными consumer’ами одновременно (см. тему «Producer и Consumer»).

Топик "orders" (3 партиции):
Partition 0: [msg1] [msg4] [msg7] ...
Partition 1: [msg2] [msg5] [msg8] ...
Partition 2: [msg3] [msg6] [msg9] ...

Offset — порядковый номер сообщения внутри одной партиции. Consumer запоминает, на каком offset он остановился — это его “закладка” в журнале сообщений, позволяющая продолжить чтение с того же места после перезапуска.

0 1 2 ←offset 3 4 прочитано до 2, дальше — новые сообщения
Копнуть глубже

Порядок гарантирован только внутри одной партиции, не между партициями. Если важна строгая последовательность обработки (например, все события одного заказа должны обрабатываться по порядку), их нужно отправлять с одним и тем же ключом — Kafka гарантирует, что сообщения с одинаковым ключом всегда попадают в одну и ту же партицию:

producer.send(new ProducerRecord<>("orders", "order-123", data));
// ключ "order-123" — все сообщения об этом заказе всегда в одной партиции, в правильном порядке

Чем больше партиций — тем выше параллелизм, но больше партиций также означает больше накладных расходов на координацию. Количество consumer’ов в одной Consumer Group имеет смысл увеличивать не больше, чем число партиций — лишние consumer’ы просто будут простаивать, партиций на всех не хватит.

🎤 Закрыл тему, если можешь объяснить:
• что такое партиция и offset;
• почему порядок гарантирован только внутри партиции и как ключ сообщения на это влияет (если дошёл до 2-го слоя).