Offset, партиции
Партиция — топик физически разбит на несколько частей (партиций), чтобы можно было обрабатывать сообщения параллельно, разными consumer’ами одновременно (см. тему «Producer и Consumer»).
Топик "orders" (3 партиции):
Partition 0: [msg1] [msg4] [msg7] ...
Partition 1: [msg2] [msg5] [msg8] ...
Partition 2: [msg3] [msg6] [msg9] ...
Offset — порядковый номер сообщения внутри одной партиции. Consumer запоминает, на каком offset он остановился — это его “закладка” в журнале сообщений, позволяющая продолжить чтение с того же места после перезапуска.
Копнуть глубже
Порядок гарантирован только внутри одной партиции, не между партициями. Если важна строгая последовательность обработки (например, все события одного заказа должны обрабатываться по порядку), их нужно отправлять с одним и тем же ключом — Kafka гарантирует, что сообщения с одинаковым ключом всегда попадают в одну и ту же партицию:
producer.send(new ProducerRecord<>("orders", "order-123", data));
// ключ "order-123" — все сообщения об этом заказе всегда в одной партиции, в правильном порядке
Чем больше партиций — тем выше параллелизм, но больше партиций также означает больше накладных расходов на координацию. Количество consumer’ов в одной Consumer Group имеет смысл увеличивать не больше, чем число партиций — лишние consumer’ы просто будут простаивать, партиций на всех не хватит.
• почему порядок гарантирован только внутри партиции и как ключ сообщения на это влияет (если дошёл до 2-го слоя).