← Назад ко всем вопросам

Как происходит доставка и чтение сообщений в Kafka

1️⃣ Как кратко ответить

Apache Kafka использует модель публикации-подписки для доставки сообщений. Продюсеры отправляют сообщения в топики, которые разбиваются на партиции. Консумеры читают сообщения из этих партиций, используя смещения для отслеживания прочитанных сообщений. Доставка сообщений гарантируется за счет репликации партиций и механизма подтверждений (acknowledgments).

2️⃣ Подробное объяснение темы

Apache Kafka — это распределенная платформа потоковой передачи данных, которая позволяет публиковать, хранить и обрабатывать потоки записей в реальном времени. Основные компоненты Kafka включают продюсеров, брокеров, топики, партиции и консумеров.

Топики и партиции

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

Продюсеры

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

Доставка сообщений

  1. Отправка сообщения: Продюсер отправляет сообщение в определенный топик. Сообщение записывается в одну из партиций этого топика.

  2. Репликация: Для обеспечения надежности каждая партиция может иметь несколько реплик, которые хранятся на разных брокерах. Это позволяет системе оставаться доступной даже при сбое одного из брокеров.

  3. Подтверждения (acknowledgments): Продюсер может настроить уровень подтверждений, чтобы гарантировать доставку сообщения. Например, можно настроить подтверждение от всех реплик (all), от лидера партиции (leader) или не ждать подтверждений (none).

Консумеры

Консумеры — это приложения или сервисы, которые читают сообщения из топиков. Консумеры объединяются в группы, и каждая группа получает все сообщения из топика, но каждое сообщение обрабатывается только одним консумером в группе.

Чтение сообщений

  1. Смещения (offsets): Каждое сообщение в партиции имеет уникальный идентификатор — смещение. Консумеры используют смещения для отслеживания, какие сообщения уже были прочитаны.

  2. Чтение из партиций: Консумер читает сообщения из одной или нескольких партиций. Kafka гарантирует, что сообщения в партиции будут прочитаны в том порядке, в котором они были записаны.

  3. Коммит смещений: После успешной обработки сообщения консумер может зафиксировать (commit) смещение, чтобы при повторном запуске начать чтение с последнего зафиксированного смещения.

Пример кода:

from kafka import KafkaProducer, KafkaConsumer
​
# Создание продюсера
producer = KafkaProducer(bootstrap_servers='localhost:9092')
​
# Отправка сообщения в топик 'my_topic'
producer.send('my_topic', b'Hello, Kafka!')
​
# Создание консумера
consumer = KafkaConsumer(
    'my_topic',
    bootstrap_servers='localhost:9092',
    auto_offset_reset='earliest',
    enable_auto_commit=True,
    group_id='my_group'
)
​
# Чтение сообщений из топика
for message in consumer:
    print(f"Получено сообщение: {message.value.decode('utf-8')}")
  • KafkaProducer и KafkaConsumer — классы для создания продюсера и консумера соответственно.
  • bootstrap_servers — адреса брокеров Kafka.
  • producer.send — отправка сообщения в указанный топик.
  • KafkaConsumer — подписка на топик и чтение сообщений.
  • auto_offset_reset='earliest' — настройка для чтения сообщений с начала, если смещение не найдено.
  • enable_auto_commit=True — автоматическая фиксация смещений после чтения сообщений.
  • group_id — идентификатор группы консумеров, чтобы координировать чтение сообщений.

Эти механизмы делают Kafka мощным инструментом для обработки потоков данных в реальном времени, обеспечивая надежность и масштабируемость.

Тема: Асинхронные системы и очереди
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки