Этот вопрос проверяет понимание заголовков сообщений в Apache Kafka, которые используются для передачи метаданных без изменения тела сообщения.
В Apache Kafka сообщение (record) состоит из ключа (key), значения (value), временной метки (timestamp) и необязательных заголовков (headers). Заголовки представляют собой список пар ключ-значение, где ключ — строка, а значение — массив байтов. Они были добавлены в версии Kafka 0.11.0 для передачи метаданных, которые не должны быть частью основного тела сообщения.
Заголовки решают несколько важных задач в event-driven архитектуре:
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
}Вывод: Используйте заголовки Kafka, когда вам нужно передать метаданные сообщения (идентификаторы, контекст, версионирование), не загрязняя основное тело сообщения. Это особенно полезно в микросервисных архитектурах для трассировки, маршрутизации и соблюдения контрактов данных.