gpt4 book ai didi

java - 带有 ThreadPools 或 Spring Async 的 Logback MDC

转载 作者:行者123 更新时间:2023-12-03 11:18:04 24 4
gpt4 key购买 nike

我正在尝试确定线程安全性 MDC是在使用 Cacheable ThreadPools 或 Spring 的 Async 注释时。

我有一个方法可以调用多个 CompletableFuture<>并使用线程池执行它们

@Async
public CompletableFuture<List> someMethod(String request) {
try {
MDC.put("request", request)
MDC.put("loggable1", "loggable1");
MDC.put("loggable2", "loggable2");
log.info("Log Event");
} finally {
MDC.clear();
}
}

Logback 的 MDCAdapter 相关部分
final ThreadLocal<Map<String, String>> copyOnThreadLocal = new ThreadLocal<Map<String, String>>();

public void put(String key, String val) throws IllegalArgumentException {
if (key == null) {
throw new IllegalArgumentException("key cannot be null");
}

Map<String, String> oldMap = copyOnThreadLocal.get();
Integer lastOp = getAndSetLastOperation(WRITE_OPERATION);

if (wasLastOpReadOrNull(lastOp) || oldMap == null) {
Map<String, String> newMap = duplicateAndInsertNewMap(oldMap);
newMap.put(key, val);
} else {
oldMap.put(key, val);
}
}

public void clear() {
lastOperation.set(WRITE_OPERATION);
copyOnThreadLocal.remove();
}


public void remove(String key) {
if (key == null) {
return;
}
Map<String, String> oldMap = copyOnThreadLocal.get();
if (oldMap == null)
return;

Integer lastOp = getAndSetLastOperation(WRITE_OPERATION);

if (wasLastOpReadOrNull(lastOp)) {
Map<String, String> newMap = duplicateAndInsertNewMap(oldMap);
newMap.remove(key);
} else {
oldMap.remove(key);
}
}

由于 ThreadPools 重用已经产生的线程并且 MDC 使用 ThreadLocal 上下文映射。我们是否可能丢失或损坏存储在 MDC 中的值?如果是这样,这可能发生的潜在场景是什么?

最佳答案

我只是想说,我们看到的东西与您所描述的很相似。我还没有具体的证据,但是通过代码爬行,看起来将事件刷新到附加程序所需的时间可能会导致 MDC 在我们的线程池清理例程运行后被读取,特别是因为我们正在刷新日志到 Kafka(网络 I/O 通常比系统上的任何东西都慢得多)。他们使用本地写时复制可继承线程来存储 MDC 映射本身,但我不确定这将如何响应 MDC.clear() 例如。我们有许多并行执行的非常短暂的任务,因此混合使用 Kafka 似乎很可能会导致竞争条件。

另一方面 - 为每个条目存储 map 的副本 - 似乎它可能无法缩放(可能会导致内存爆炸和 GC 崩溃)。我目前正在寻找一个中间立场。

关于java - 带有 ThreadPools 或 Spring Async 的 Logback MDC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39908129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com