我們正在運行它本身包含幾個微服務的Web應用程序跟蹤請求過程,併爲每個請求,我們需要最後調用第三方服務,這是耗時,通常需要幾秒鐘的時間。我們需要使用請求traceId來跟蹤每個請求的所有服務中的所有處理日誌。如何使用NIO或事件驅動的框架時,像Netty的
在當前的實現中,我們使用的是基於線程的併發模型,一個線程被分配到從開始的每個服務的最終處理請求,並等待遠程服務的響應時受阻。這是很自然的把traceId到ThreadLocal的這樣我們就可以拿回來,每當/地方,我們需要它。
但基於線程的併發模型不能很好地擴展,我們傾向於更改爲NIO /事件驅動模型,並試圖Netty的一個非常大的性能提升。但是每個請求處理的不同階段可能會由Netty的不同線程處理,這使得日誌的跟蹤非常棘手。
我們目前的考慮因素包括:
- 通traceId作爲方法的參數,它已經在請求無論如何,但它如果一個深嵌套的方法需要它非常不便利。
- Set traceId into ThreadLocal在每次回調開始時。但是我個人認爲這種方法很容易出錯,並且可能會引入難以找到的競爭條件錯誤。
那麼,在NIO /事件驅動模型中解決這種跟蹤問題的複雜/優雅的方法是什麼?
您可以使用通道ID而不是線程嗎? – Nicholas