2017-11-10 30 views
0

grpc-javaを使用していて、A、B、Cの3つのサービスを持っています。サービスAを呼び出し、サービスAがBとCを呼び出します。BとCの呼び出しでHystrixを使用しています。別のサービスを呼び出す。gRPCのコンテキストから別のスレッド/ threadPoolにtraceIdを渡すには?

traceIdの周りを通過するClientInterceptorsとServerInterceptorsがあります。コンテキスト内のtraceIdsを見ることができ、gRPCワーカースレッドであればログを記録できますが、呼び出しが別のスレッド(RxIoSchedulerスレッドまたはHystrixスレッド)に移動したときにトレースIDを失います。 traceIdを、異なるスレッド上の要求と、異なるexecutorサービスとスレッドプール間の要求の間に渡すにはどうすればよいですか?

答えて

0

executor.execute(Context.current().wrap(runnable))のように)きめ細かな方法で伝播することはできますが、Context伝播をクロススレッドワーク転送に統合するようにしてください。多くのアプリケーションでは、それはすぐにそれが作成されるようwrapping the "main" executorのような単純なものだろう:

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

は、アプリケーションの冒頭で一度、これを行うと、あなたは、ほとんどの伝播を心配停止します。

ただし、アプリケーションはさまざまです。

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)); 
    } 
} 
:たとえば、作成するアプリケーションは Thread sが直接、おそらく呼び出し側スレッドの Context Threadに伝播 ThreadFactoryをしなければなりません
関連する問題