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

Если у тебя сервис должен сразу ответить на webhook и дальше обрабатывать асинхронно, MDC контекст теряется. Как этого избежать?

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

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

sobes.tech AI

MDC (Mapped Diagnostic Context) в логировании используется для передачи контекста (например, requestId) в рамках одного потока. При асинхронной обработке, особенно если она происходит в другом потоке или после ответа на webhook, MDC контекст не передается автоматически.

Чтобы сохранить MDC контекст при асинхронной обработке, можно:

  • Явно скопировать MDC контекст из текущего потока и передать его в асинхронную задачу. Например, сохранить Map<String, String> contextMap = MDC.getCopyOfContextMap() и в асинхронном потоке вызвать MDC.setContextMap(contextMap).
  • Использовать специальные обертки для Runnable/Callable, которые автоматически передают MDC (например, DelegatingSecurityContextRunnable в Spring Security или собственные реализации).
  • В Spring можно использовать TaskDecorator для ThreadPoolTaskExecutor, чтобы автоматически копировать MDC в новые потоки.

Пример с использованием копирования контекста:

Map<String, String> contextMap = MDC.getCopyOfContextMap();
executor.submit(() -> {
    if (contextMap != null) {
        MDC.setContextMap(contextMap);
    }
    // асинхронная логика
    MDC.clear();
});

Таким образом, контекст логирования сохраняется и в асинхронной обработке.