Sobes.tech
Назад к вопросам
Senior
4

С Kafka что делать с MDC контекстом?

Компании, где спрашивали
СБК ПАРУС

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

sobes.tech AI

MDC (Mapped Diagnostic Context) используется для хранения контекста логирования, например, идентификаторов запросов, пользователя и т.п. В связке с Kafka возникает проблема: при асинхронной обработке сообщений MDC не передаётся автоматически между потоками.

Чтобы сохранить MDC контекст при работе с Kafka, обычно делают следующее:

  1. Перед отправкой сообщения:

    • Добавляют нужные MDC значения в заголовки Kafka-сообщения (Headers).
  2. При получении сообщения:

    • Извлекают значения из заголовков и восстанавливают MDC контекст для текущего потока.

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

Пример на Java:

// При отправке
ProducerRecord<String, String> record = new ProducerRecord<>(topic, key, value);
MDC.getCopyOfContextMap().forEach((k, v) -> record.headers().add(k, v.getBytes(StandardCharsets.UTF_8)));
producer.send(record);

// При получении
ConsumerRecord<String, String> record = ...;
Map<String, String> contextMap = new HashMap<>();
record.headers().forEach(header -> contextMap.put(header.key(), new String(header.value(), StandardCharsets.UTF_8)));
MDC.setContextMap(contextMap);

// Далее логируем с восстановленным MDC

Также существуют библиотеки и обёртки для Kafka Producer/Consumer, которые автоматизируют эту работу.

Важно не забывать очищать MDC после обработки сообщения, чтобы избежать утечек контекста между потоками.