Sobes.tech
Назад к вопросам
Junior — Middle
66

Как определяется порядок обработки сообщений в Kafka?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Порядок сообщений в Kafka гарантируется только внутри одной партиции. Если сообщения отправляются с одним и тем же key, они обычно попадают в одну партицию и читаются последовательно. Между разными партициями глобального порядка нет, поэтому при масштабировании его нельзя считать строгим.

Определение:

Kafka хранит сообщения в топике, разбитом на партиции. Внутри каждой партиции сообщения упорядочены по offset: новое сообщение получает больший offset и читается по возрастанию. Гарантия порядка действует только в рамках одной партиции, а не всего топика.

На порядок влияют:

  • выбор партиции при записи;
  • количество producer’ов;
  • ретраи и настройки подтверждения отправки;
  • порядок обработки на стороне consumer’а.

Пример использования:

Если нужно сохранить порядок событий по одному пользователю, сообщения с user_id отправляют с этим ключом. Тогда все события конкретного пользователя попадут в одну партицию и будут обработаны по порядку.

from kafka import KafkaProducer

producer = KafkaProducer(
    bootstrap_servers=["localhost:9092"],
    key_serializer=lambda k: k.encode("utf-8"),
    value_serializer=lambda v: v.encode("utf-8"),
)

producer.send(
    "user-events",
    key="user-123",
    value='{"event":"created"}'
)

producer.send(
    "user-events",
    key="user-123",
    value='{"event":"updated"}'
)

producer.flush()

Пояснение кода:

Код показывает отправку двух сообщений с одинаковым key user-123. Брокер, как правило, отправит их в одну и ту же партицию, поэтому Kafka сохранит их порядок внутри этой партиции. Если отправить сообщения с разными ключами, они могут попасть в разные партиции, и общий порядок между ними уже не будет гарантирован.

Ключевые моменты:

  • Порядок в Kafka гарантирован только внутри одной партиции.
  • Offset растет последовательно, и consumer читает сообщения в порядке offset.
  • Одинаковый key обычно помогает держать связанные сообщения в одной партиции.
  • Между партициями строгого глобального порядка нет.
  • При ретраях и нескольких producer’ах важно учитывать возможные нарушения ожидаемого порядка на уровне приложения.