Sobes.tech
Senior
59

Ce trebuie făcut cu contextul MDC în Kafka?

Companiile au fost întrebate
СБК ПАРУС

Răspuns de la AI

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 после обработки сообщения, чтобы избежать утечек контекста между потоками.