マイクロサービス分散アーキテクチャでログリンクトラッキングを実装するにはどうすればよいですか?

マイクロサービス分散アーキテクチャでログリンクトラッキングを実装するにはどうすればよいですか?

背景

システムの問題をトラブルシューティングするために最も一般的に使用される方法は、システム ログを確認することです。分散環境では、通常、ELK はログを統一された方法で収集するために使用されます。ただし、同時実行数が多い場合は、ログを使用して問題を特定するのは依然として面倒です。次の図を見てみましょう。

上の図では、ユーザーが URL を要求しています。リンク全体を図に示します。各処理層はログを生成します。では、これらのログを連結してリクエストのフルパス ログを形成するにはどうすればよいでしょうか?

既存のシステムでは、他のユーザー/他のスレッドのログも大量に出力され、通過してしまうため、指定したリクエストに関連するログをすべてフィルタリングすることが困難です。それで、これにどう対処すればいいのでしょうか?

解決

各リクエストに一意の識別子を付与し、ログを印刷するときに各リクエストに一意の識別子を使用できます。一意の識別子はダウンストリーム サービスに渡す必要があり、ダウンストリーム サービスもログを印刷するときにこの一意の識別子を含めます。この方法では、すべてのリンクを適切に追跡し、ログに表示することができます。

では、技術的な実装計画は何でしょうか?コードにできるだけ影響を与えないようにし、Logback の MDC メカニズムを使用して、ログ テンプレートに traceId 識別子を追加する必要があります。値は%X{traceId}です。

MDCとは

MDC (Mapped Diagnostic Context) は、マルチスレッド条件下でのログ記録を容易にするために log4j および logback によって提供される機能です。 MDC は、キーと値のペアを追加できる、現在のスレッドにバインドされたマップとして見ることができます。

MDC の内容には、同じスレッドで実行されるコードからアクセスできます。現在のスレッドの子スレッドは、親スレッドの MDC の内容を継承します。ログ記録が必要な場合は、MDC から必要な情報を取得するだけで済みます。 MDC の内容は、プログラムによって適切なタイミングで保存されます。 Web アプリケーションの場合、このデータは通常、処理されるリクエストの最初に保存されます。

ソリューションの実装

MDC は内部的に ThreadLocal を使用するため、このスレッドでのみ有効であり、子スレッドおよび下流のサービス MDC の値は失われます。したがって、ソリューションの主な難しさは、主に次の部分を含む価値転送問題を解決することです。

  • API Gateway の MDC データを下流のサービスに渡す方法
  • 他のリモート サービスを呼び出すときに、サービスはどのようにデータを受信して​​渡すのでしょうか?
  • 非同期の場合に子スレッドに渡す方法(スレッドプール)

ログテンプレートを変更する

このフラグをログバック設定ファイルのログフォーマットに追加します

ゲートウェイフィルターの追加

このフィルターは、ゲートウェイが MDC データをダウンストリーム サービスに渡す方法を解決します。

トレースIDを生成し、ヘッダーを介して下流のサービスに渡す

上記のコードには、org.slf4j.MDC に属する MDC があります。定数値は次のとおりです。

  1. /**
  2. * ログリンクトラッキングID情報ヘッダー
  3. */
  4. 文字列 TRACE_ID_HEADER = "x-traceId-header" ;
  5. /**
  6. * ログリンクトラッキングIDログフラグ
  7. */
  8. 文字列 LOG_TRACE_ID = "traceId" ;

下流サービスにスプリングインターセプターを追加

traceId の値を受け取って保存します。

ダウンストリーム サービスにフェイク インターセプターを追加する

現在のサービスの traceId 値をダウンストリーム サービスに渡し続けます。

親子スレッド転送の問題を解決する

スレッドプール(非同期・並列処理)は主にビジネスで使用され、Spring自体にもスレッドプールを使用するための@Asyncアノテーションがあります。この問題を解決するには、次の 2 つの手順が必要です。

logbackのLogbackMDCAdapterを書き換える

logback の MDC 実装は内部的に ThreadLocal を使用しており、子スレッドを転送できないため、書き直して Alibaba の TransmittableThreadLocal に置き換える必要があります。

TransmittableThreadLocal は、スレッドをキャッシュするスレッド プールなどのコンポーネントを使用するときに ThreadLocal を転送する問題を解決するために Alibaba によって開発されたオープン ソースの InheritableThreadLocal 拡張機能です。 TransmittableThreadLocal をスレッド プールとメイン スレッド間で転送する場合は、TtlRunnable および TtlCallable と一緒に使用する必要があります。

  • 残りのコードは ch.qos.logback.classic.util.LogbackMDCAdapter と同じですが、代わりに copyOnInheritThreadLocal が呼び出されます。

TtlMDCAdapterInitializer クラスは、プログラムの起動時に独自の mdcAdapter 実装をロードするために使用されます。

スレッドプールの実装の拡張

TtlRunnable および TtlCallable 拡張機能を追加します。

シナリオテスト

テストコードは次のとおりです。

  1. log.info( "テスト" )
  2. @非同期
  3. パブリックボイドテスト(){
  4. log.info( "テスト1" )
  5. }
  6. userService.findByUserName( "gu" );

APIゲートウェイによって出力されるログ

ELK 集計ログは、traceId でリンク ログ全体を照会します。

システムで例外が発生した場合、次の図のように、例外ログの traceId 値を通じて、ログ センターでリクエストのすべてのログ情報を直接照会できます。

要約する

この時点で分散ログ追跡が完了し、マイクロサービス全体のログリンクを簡単に確認できるようになりました。ありがとう!!!

著者: 教室を楽しむ

リンク: https://www.jianshu.com/p/a3ebc9249b69

出典:建書

<<:  JVMにおけるJavaポリモーフィズムは次のようになります

>>:  10 年以上前から話題になっている生物学クラウド コンピューティングが、いまだに停滞しているのはなぜでしょうか?

推薦する

UCloud Safe Houseが受賞し、スマートシティの「イノベーションエンジン」となった

10月11日、成都ハイテク区主催のスマートシティ建設計画募集コンペティションと新経済活力フォーラムが...

男性の財布を空にしているのはどのインターネット企業でしょうか? ユーザーの定着率を高める5つのヒント

女性は買い物に行き、男性はバッグを持つものだと信じているに違いありません。同様に、多くの人の印象では...

プログラマーはマクロとミクロの観点から JVM 仮想マシンを分析します。

1. 問題JAVA テキスト ファイルはどのようにして CLASS バイナリ ファイルに変換されるの...

Baiduスパイダーをあなたの花嫁にして、検索エンジンがあなたのウェブサイトをもっと好きになるようにしましょう

コアヒント: 検索エンジンにウェブサイトをもっと気に入ってもらうにはどうすればよいでしょうか? 初心...

クラウドネイティブアプリケーションのセキュリティ組織アーキテクチャの簡単な分析

デジタル変革は無視できない力です。あらゆる業種において、企業はテクノロジー企業になることを目指してお...

WeChat 7.0.7 内部ベータ版がリリース、ミニプログラムの評価が正式に「登場」?

WeChat 7.0.7 がリリースされました!昨日、WeChat は Android バージョン ...

ワールドカップ生中継権事件の裏側:視聴者は動画サイトへ移行

原題: 対立とチャンス: ワールドカップ「インターネット」イベント毎年のワールドカップは中国のインタ...

ポストエピデミック時代にエッジコンピューティングを導入する際に企業が考慮すべきこと

感染症の拡大が続き、在宅勤務する従業員の数が増え続ける中、多くの企業が業務をエッジに移行し、データ量...

Sina WordPress クラウド ブログ プラグインとテーマのアップロードの問題

Sina が立ち上げたクラウド プラットフォームは、WordPress ブログを作成したい人にとって...

分散ストレージシステムの理論的指針をCAPからPACELCに移行する時期が来ている

CAP 理論は、分散ストレージ システムの現在の設計に対する理論的ガイドラインであり、PACELC ...

#推奨# 月額 30 ドル、(ロサンゼルス/サンノゼ) 専用サーバー、e3-1230/16g メモリ/1T ハードディスク/100M または 1G 帯域幅無制限トラフィック

Raksmart がスーパープロモーションを開始し、米国西海岸のサンノゼとロサンゼルスのデータセンタ...

百度の青大根アルゴリズムが再び始動、リンクの売買行動に影響

2013年2月19日、Baiduのアルゴリズムが再び調整されました。Baiduのウェブ検索不正対策チ...

分散型コンセンサスアルゴリズム: 想像以上に複雑

1. 分散システムの難しさ張大鵬は難しい問題に遭遇した。彼らの会社には貴重なデータを保存するサーバー...

クラウドコンピューティングとエッジコンピューティング

クラウド コンピューティングとエッジ コンピューティングの違いについて議論する際には、データ処理の実...

医療ウェブサイトの最適化ロングテールワードランキングルール

2012 年 3 月 5 日月曜日、著者は医療業界のウェブサイトの最適化方法を分析し、共通の特徴を発...