Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Kafka: Kafka headers, message metadata, Apache Kafka, producer consumer, message enrichment

Что такое headers в Kafka?

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

Короткий ответ

Headers в Kafka — это необязательные пары ключ-значение, которые можно прикрепить к сообщению. Они позволяют передавать метаданные, такие как идентификатор трассировки, тип сообщения или информация о версии, отдельно от основного содержимого (value). Это полезно для маршрутизации, фильтрации, логирования и сквозной трассировки в распределённых системах. Заголовки не влияют на партиционирование сообщений, в отличие от ключа (key).

Длинный ответ

В Apache Kafka сообщение (record) состоит из ключа (key), значения (value), временной метки (timestamp) и необязательных заголовков (headers). Заголовки представляют собой список пар ключ-значение, где ключ — строка, а значение — массив байтов. Они были добавлены в версии Kafka 0.11.0 для передачи метаданных, которые не должны быть частью основного тела сообщения.

Для чего используются заголовки?

Заголовки решают несколько важных задач в event-driven архитектуре:

  • Сквозная трассировка (Distributed Tracing): добавление идентификатора трассировки (например, trace-id) позволяет отслеживать путь запроса через несколько микросервисов.
  • Маршрутизация и фильтрация: потребитель может читать только сообщения с определёнными заголовками, не десериализуя всё тело.
  • Обогащение сообщений: передача контекстной информации, например, версии схемы данных (schema-version: "1.2") или типа события (event-type: "OrderCreated").
  • Аудит и логирование: добавление идентификатора пользователя или источника сообщения для отладки.

Практический пример

Рассмотрим код на Java с использованием Kafka Producer API для отправки сообщения с заголовками:

import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.header.Header;
import org.apache.kafka.common.header.internals.RecordHeader;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public class ProducerWithHeaders {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        Producer producer = new KafkaProducer<>(props);

        // Создаем список заголовков
        List
headers = new ArrayList<>(); headers.add(new RecordHeader("trace-id", "abc-123-xzy".getBytes())); headers.add(new RecordHeader("event-source", "order-service".getBytes())); // Создаем ProducerRecord с заголовками ProducerRecord record = new ProducerRecord<> ("orders-topic", null, "order-456", "{\"status\":\"created\"}", headers); producer.send(record); producer.close(); } }

Потребитель (Consumer) может затем прочитать эти заголовки:

// В цикле обработки записей
for (ConsumerRecord record : records) {
    Iterable
headers = record.headers(); for (Header header : headers) { System.out.println(header.key() + ": " + new String(header.value())); } // trace-id: abc-123-xzy // event-source: order-service }

Важные особенности

  • Заголовки не влияют на партиционирование — для этого используется ключ (key) сообщения.
  • Значения заголовков — это массивы байтов, поэтому необходимо соглашение о сериализации (часто используют строки в UTF-8).
  • Заголовки поддерживаются большинством клиентских библиотек Kafka (Java, .NET, Python и др.).
  • Они не индексируются Kafka, поэтому фильтрация по заголовкам происходит на стороне потребителя.

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

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • Kafka

    Kafka

Ключевые слова

#Kafka headers

#message metadata

#Apache Kafka

#producer consumer

#message enrichment

Подпишись на Java Developer в телеграм