2017-11-10 127 views
0

我正在使用grpc-java,并有3个服务,A,B和C.我称服务A,然后服务A调用B和C.我在调用B和C时使用Hystrix。C又产生另一个线程拨打另一项服务。如何将traceId从gRPC的上下文传递到另一个线程/线程池?

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

回答

0

尽管可以以细粒度的方式传播(如executor.execute(Context.current().wrap(runnable))),但您应该尝试将Context传播集成到跨线程工作传输中。对于许多应用中,会尽快,因为它是建立像wrapping the "main" executor简单:

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

在你的应用程序的开始做这一次,然后你大多停止担心传播。

但是应用程序会有所不同。例如,创建应用程序Thread小号直接或许应该做一个ThreadFactory中传播调用线程的ContextThread

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)); 
    } 
} 
相关问题