私たちはいくつかのマイクロサービスで構成されたWebアプリケーションを実行しており、リクエストごとに最終的にサードパーティサービス時間がかかり、通常は数秒かかる。 リクエストtraceIdを使用して、各リクエストのすべてのサービス間ですべての処理ログをトレースする必要があります。NIOやNettyのようなイベントドリブンフレームワークを使用する場合のリクエストプロセスのトレース方法
現在の実装では、スレッドベースの同時実行モデルを使用しています。スレッドは、各サービスで最初から最後まで要求を処理するように割り当てられ、リモートサービスの応答を待つときにブロックされます。 traceIdをThreadLocalに入れて、いつでもどこでも必要なときにいつでも戻すことができます。
しかし、スレッドベースの並行性モデルは拡張性がよくないため、NIO /イベント駆動型モデルに変更する傾向があり、パフォーマンスが非常に向上してNettyを試用しました。しかし、リクエスト処理ごとに異なる段階がNettyの異なるスレッドによって処理され、ログのトレースが非常に難しくなる可能性があります。
我々の現在の考慮事項は、次のとおりです
- パスTRACEIDメソッドのパラメータとして、それはとにかく、要求にすでにだが、深いネストされた方法は、それを必要とする場合、それは非常に非便利です。
- セットtraceIdにスレッドローカルすべてのコールバックの冒頭に。しかし、個人的に私はこのアプローチがエラーを起こしやすく、競合状態のバグが見つからない可能性があると考えています。
NIO /イベント駆動モデルでこのようなトレースの問題を解決するには、洗練された方法がありますか。
スレッドの代わりにチャンネルIDを使用できますか? – Nicholas