疎結合のマイクロサービスアーキテクチャでは、依存関係をどのように追跡しますか?


9

最新のプログラムで人気のある高レベルのアーキテクチャの選択は、RESTベースのマイクロサービスシステムです。これには、疎結合、再利用の容易さ、使用できるテクノロジーの制限の制限、高いスケーラビリティなどのいくつかの利点があります。

しかし、そのようなアーキテクチャーで私が予測する問題の1つは、アプリケーションの依存関係が何であるかについての可視性が低いことです。たとえば、1組のREST呼び出しを毎日使用するアプリケーションがあるとします。このアプリケーションは、REST呼び出しの2番目のセットも使用しますが、四半期に1回だけです。過去1週間のログをスキャンすると、1日のカロリーはすべて表示されますが、四半期ごとの呼び出しは表示されません。リファクタリングの時期になると、四半期ごとの呼び出しが中断するリスクが高くなります。

このリスクを軽減し、疎結合アーキテクチャの依存関係をより詳細に可視化するために使用できるパターンまたはツールは何ですか?


1
これが、疎結合が良くない理由です。コンパイル時の依存関係がない場合、エラーを検出する唯一の方法は、自動テストを使用することです。ソリューションは、ある種の自動化されたテストであり、おそらく単体テストと統合テストが含まれます。
フランクヒルマン2017

@FrankHileman Testingは明らかに役立ちますが、これが唯一の解決策であるとは信じられません。さらに、コンパイル時のチェックを行わない言語(JSやPythonなど)が多数あるため、密結合であっても問題が発生します。
デビッドはモニカを

1
静的型システムは、コンパイル段階で多数のエラーをキャッチできます。そのようなシステムの欠如に対する唯一の補償は、私の知る限り、自動テストです。自動校正または単にコンパイルによる静的エラー検出は、テストよりも常に信頼性が高くなります。
フランクヒルマン2017

1つの可能な方法は、各サービスのAPIクライアントを個別に実装し、これらのクライアントをプロジェクトの依存関係として含めることです。APIクライアントを使用すると、使用しているサービスのバージョンを追跡するのも簡単になります。
ライヴ2017

@Laiv私は特にRESTfulなサービスに興味があります。だれでも多かれ少なかれHTTPリクエストを送信できるので、それは実際にはオプションではありません。
デビッドはモニカ

回答:


4

このリスクを軽減するために使用できるパターンまたはツール

APIとビジネス機能の下位互換性を維持します。

疎結合アーキテクチャの依存関係がどのようなものであるかについての詳細な可視性を提供します

ヘルスチェック。

私のサービスは、毎月のAPI機能のクライアントです。しかし、私のサービスは、私のサービスが実行されているときはいつでも、あなたのAPIのクライアントです。したがって、私のサービスは10分ごとに起動するか、毎月のAPIに接続してプロトコルを実行し、サービスに必要な機能が引き続き利用可能であることを確認します。

そのため、ログには、提供する特定の各サービスが実際に使用される頻度が示されているのと同じように、提供する各特定のサービスがまだ利用可能であることを確認するために他のサービスがチェックする頻度が示されます。


1

依存関係を見つけることができる場所が少なくとも2つあります。

  • 構成。外部APIにアクセスするには、それらの各APIに関する一連の情報を知る必要があります。アクセスID、秘密鍵、エンドポイント。このような情報変更されるため、これらすべてをコードに含めることはできません。例として、最近すべてのマイクロサービスをSSLに移行し始めました。つまり、移行されるサービスに依存するすべてのサービスは、ではなくバージョンを指すように再構成する必要があります。エンドポイントがハードコーディングされているのではなく、構成内にあったことをうれしく思います。https://http://

  • インターフェース。APIのバージョンが変更されるため、サービスからコードに直接アクセスすることはありません。また、別のAPIに切り替えることもできます。代わりに、抽象化レイヤーを作成し、インターフェイスを通じて依存関係を使用します。これらのインターフェースを作成するときに共通のロジックに従うことで、後で依存関係を検索するときに作業が楽になります。

リファクタリングの時期になると、四半期ごとの呼び出しが中断するリスクが高くなります。

これが回帰テストの目的です。

コードを見て、変更して、何も壊れていないことを信じることはできません。これはマイクロサービスアーキテクチャでは機能しません。これはモノリシックアプリケーションでも機能しません。コンパイラは、コードを変更するときに発生するエラーの一部をキャッチできます。Haskellなどの一部の言語では、コンパイラーは非常に能力があり、ほとんどのエラーをキャッチできます。ただし、主流の言語用のコンパイラーはあまり役に立ちません。あなたがテストを持っていない場合、あなたは台無しにされています。マイクロサービスの存在は無関係です。


-2

REST APIは大まかに指定されているため、ある時点でgRPC、google protobufs、またはThriftに移動してRPCインターフェースを定義し、バージョン管理することが役立つ場合があります。


2
これはコメントとしては良いかもしれません...しかし正直これはあまり説明しません。
デビッドは、モニカを

けっこうだ。REST APIは、別のサービスに特定のコンパイル時依存関係はありません。これは、2つのサービス間のリンクがホストとパスのような単なるHTTP REST呼び出しであるためです。gRPC、またはProtobufまたはThriftでは、コードの生成に使用されるインターフェイスが定義されています。生成されたコードがコンパイルおよびバージョン管理され、それらのインターフェースに対してサービスが構築されます。その結果、各サービスは1つ以上の他のサービスインターフェイスに明らかに依存しています。私の答えが明確になることを願っています!
Patrick
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.