Senior
56
¿Qué hacer con el contexto MDC en Kafka?
Empresas donde se preguntó
СБК ПАРУС
Respuesta de la IA
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 после обработки сообщения, чтобы избежать утечек контекста между потоками.