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

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

背景

システムの問題をトラブルシューティングするために最も一般的に使用される方法は、システム ログを確認することです。分散環境では、通常、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 年以上前から話題になっている生物学クラウド コンピューティングが、いまだに停滞しているのはなぜでしょうか?

推薦する

急成長するインターネット「釣魚経済」

「Diaosi」は、Baidu TiebaのLi Yi Barに由来しています。D8の元幹部Caob...

WAN 変革: クラウド コンピューティングからユビキタスなエラスティック ネットワークへ

中小企業から業界大手まで、企業がネットワークを購入、展開、管理、拡張する方法は根本的に変化しました。...

誰もが SEO を知っていたら、サイトはどのように競争するのでしょうか?

これまで、SEOトレーニングは大規模に増加しています。ウェブマスターまたはウェブサイト構築者であれば...

justhostはどうですか?アトランタ VPS シンプルレビュー

justhostはどうですか? justhost は米国東海岸のアトランタに米国で 3 番目のデータ...

外部リンクスキル:「質の高いフォーラム」の実践

外部リンクの重要性は自明であり、最適化の実践者にとっては日常的に必須のものです。外部リンクを作成する...

Baidu SearchがAuroraアルゴリズムを導入:オリジナルで高品質なコンテンツの促進を目指す

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています6月7日、...

Pure Storage が Microsoft Azure にパブリック クラウド ブロック ストレージを導入

Pure Storage は、Amazon AWS との既存のパートナーシップを拡大し、Micros...

ウェブサイトのインタラクションデザイン分析: インタラクティブコンポーネントのマイクロイノベーション

インタラクションデザインの発展の歴史を振り返ると、革新的なインタラクションモードが広く受け入れられて...

B2B業界のウェブサイト電話販売に備える4つのステップ

諺にもあるように、敵をよく知っていれば、百戦錬磨の戦士はくじけません。何をするにも、万全の準備をしな...

エッジコンピューティングとエッジ AI とは何ですか?

この記事では、エッジ コンピューティングとは何かを簡単に紹介し、クラウド コンピューティング処理の一...

ARテクノロジーが新世代の労働者の学習方法を変える

拡張現実 (AR) 技術は、医療、スポーツ、製造、現場サービスなど、多くの分野に応用されており、依然...

テンセントクラウドがインドに新たなデータセンターを追加し、南アジアにデュアルアベイラビリティゾーンを正式に確立

12月24日、Tencent Cloudはインドリージョン2のサービスを正式に一般公開したと発表した...

このBaidu Kステーションの苦情に関するいくつかの小さな経験

まず最初に、私は純粋に形式的で独創的なブロガーであることを述べさせてください。スパムサイトではなく、...

2024年に注目すべきクラウドコンピューティングのトレンド

2024 年のクラウド コンピューティング分野で注目すべきトレンドは何でしょうか? 2024 年には...

5G時代に、クラウドコンピューティングと5Gはどんな火花を散らすのでしょうか?

国民全体の期待とともに、ついに5Gがデビューしました。 5G は、自動車のインターネット、スマート ...