gpt4 book ai didi

multithreading - 如何将 traceId 从 gRPC 的上下文传递到另一个线程/线程池?

转载 作者:行者123 更新时间:2023-12-03 12:59:19 30 4
gpt4 key购买 nike

我正在使用 grpc-java 并有 3 个服务,A、B 和 C。我调用服务 A,然后服务 A 调用 B 和 C。我在对 B 和 C 的调用中使用 Hystrix。C 依次产生另一个调用另一个服务的线程。

我有传递 traceId 的 ClientInterceptors 和 ServerInterceptors。只要它是 gRPC 工作线程,我就可以在 Context 和日志中看到 traceIds,但是当调用移动到另一个线程 - RxIoScheduler 线程或 Hystrix 线程时,它们就会丢失。如何在不同线程上的请求之间以及不同执行程序服务和线程池之间传递 traceId?

最佳答案

虽然可以以细粒度的方式传播(如 executor.execute(Context.current().wrap(runnable))),但您应该尝试集成 Context 传播到跨线程工作传输。对于许多应用程序,这就像 wrapping the "main" executor 一样简单一旦创建:

executor = Context.currentContextExecutor(executor);
// executor now auto-propagates

在您的应用程序开始时执行一次,然后您基本上就不再担心传播问题了。

但应用程序会有所不同。例如,直接创建 Thread 的应用程序可能应该制作一个 ThreadFactory 将调用线程的 Context 传播到 Thread:

class PropagatingThreadFactory implements ThreadFactory {
private final ThreadFactory delegate;

public PropagatingThreadFactory(ThreadFactory d) {delegate = d;}

@Override public Thread newThread(Runnable r) {
return delegate.newThread(Context.current().wrap(r));
}
}

关于multithreading - 如何将 traceId 从 gRPC 的上下文传递到另一个线程/线程池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47231289/

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