Назад к вопросам
Senior
4
С Kafka что делать с MDC контекстом?
Компании, где спрашивали
СБК ПАРУС
Ответ от нейросети
sobes.tech AI
MDC (Mapped Diagnostic Context) используется для хранения контекста логирования, например, идентификаторов запросов, пользователя и т.п. В связке с Kafka возникает проблема: при асинхронной обработке сообщений MDC не передаётся автоматически между потоками.
Чтобы сохранить MDC контекст при работе с Kafka, обычно делают следующее:
-
Перед отправкой сообщения:
- Добавляют нужные MDC значения в заголовки Kafka-сообщения (Headers).
-
При получении сообщения:
- Извлекают значения из заголовков и восстанавливают 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 после обработки сообщения, чтобы избежать утечек контекста между потоками.