2016-09-12 14 views
2

私は、ASP.NETコアWeb APIを使用してマイクロサービスアーキテクチャを作成しています。すべてのサービスは互いに分離されており、異なる環境で展開される可能性があります。すべてのサービスには独自のログがあります。これらのサービスを介して要求が流れると、サービスのいずれかで失敗する可能性があります。たとえ複数のサービスを経由する場合でも、一連のイベントをソースに追跡する方法が必要です。
この問題を処理するために、要求を発行したサービスがCorrelationIdを作成し、それを次のサービスに渡します。 2番目のサービスは3番目のサービスなどに渡します。例外が発生した場合、対応するサービスはCorrelationIdとともに例外メッセージを記録します。マイクロサービスアーキテクチャにCorrelationIdを含めるにはどうすればよいですか?

サービスの呼び出し元が相関IDを渡すのに最適な場所は何ですか?

呼び出し側は、これがあれば上記のアプローチで

public class RequestDTO 
{ 
    public string CorrelationId {get;set;} 
    public string SomeOtherData {get;set;} 
} 

public Service2Controller:Controller 
{ 
    public Task<in> DoSomething(RequestDTO request) 
    { 
     // add the correlationid in current request Items collection 
     // So global exception handling can access it and log it 
     // along with the exception 

     HttpContext.Items.Add("CorrelationId", request.CorrelationId); 
    } 
} 

と呼ばなっているサービスであるHttpHeaderにCorrelationIDのか、それは一部のメソッドのパラメータとして渡す必要があり

以下のようなものを渡す必要がありますこのメソッドを呼び出す前に例外があり、CorrelationIdはロギングのグローバル例外ハンドラで使用できません。

提案がありますか?または代替の方法

+0

デシリアライズ時などの問題を回避するため、カスタムヘッダーは通常ですが、ペイロードにも渡さないようにしてください。両方を持つことはできません。 –

+0

@TomRedfernは、httpヘッダーにカスタムデータを追加するのは '典型的なのですか? – LP13

+0

@TomRedfern各サービスは、さまざまなタイプの環境に展開できます。私の懸念は、httpヘッダーにカスタムデータを追加することが、ホストサーバーによって拒否される可能性があるということです。ホスティングサーバーは通常、不明なヘッダーをチェックしますか? – LP13

答えて

0

相関識別子は、自分で追加するものであってはいけません。メッセージを送信するフレームワークでこれを行う必要があります。このようにして、開発者はそれを忘れることができず、一貫して動作します。

MessageIdCorrelationIdをメッセージのヘッダーに入れます。最初のメッセージでは、どちらも同じになります。 2番目のメッセージでは、CorrelationIdは、前のメッセージのMessageIdに設定されています。

変更しない一意のConversationIdを設定して、1つの発信元から発生するすべてのメッセージを追跡することもできます。 pub/subを使用したり、メッセージの発信者にコールバックするときに便利です。

関連する問題