マイクロサービスアーキテクチャでは、サービスは互いに直接対話する必要がありますか?


10

Webアプリケーションを形成するWebサービスがいくつかあります。クライアントはREST API呼び出しを通じてこれらのサービスにアクセスできます。

これらのサービスは互いに直接通信できる必要がありますか?もしそうなら、それらはマイクロサービスの概念に反するカップルになるでしょうか?

クライアントは、クライアントにWebページをロードするために必要なデータを取得するために、次々にそれらを直接呼び出す必要がありますか?

または、クライアントからの要求を処理し、その要求のデータをフェッチしてからクライアントに送り返す、サービスの上に別のレイヤーを配置する必要がありますか?


完全に切り離されている場合、それらは完全に別の製品です。そのため、ユーザーはContoso Loginにログインする必要があり、その後Contoso Loginは「ログインしました!」 "...その後、データをコピーしてContoso Data Processorに貼り付けます...
user253751 2017年

回答:


15

サービスをこの図のようにしたい場合は、はい: ここに画像の説明を入力してください それを実行できないわけではありませんが、ほとんどの場合、悪い結果をもたらします。RESTを介した通信は、サービスを大幅に分離しません。一部のサービスインターフェースが変更されると、ほとんどの場合、依存するすべてのサービスを変更して再デプロイする必要があります。また、サービスを再展開する間、依存するすべてのサービスを停止する必要があります。これは、高可用性標準の優れた設計とは見なされていません。

最終的に、代替のモノリスアプリよりも遅いマイクロサービスアプリケーションが作成されますが、ほぼ同じ問題が発生します。

@Robert Harveyに同意しないと

ただし実際には、1つ以上のマイクロサービス(おそらくそれらすべて)は、SQLデータベースのようないくつかの中央データストアと通信します。

統合データベースはよく知られているアンチパターンです

より優れたソリューションは、サービス間の通信を非同期にするために、パブリッシュ/サブスクライブパターンを使用することです。

ここに画像の説明を入力してください

この通信方法を実装するCQRS / ESの方法をご覧ください。GregYoungや他の連中が、このトピックに関する素晴らしい動画をたくさん提供しています。"CQRS / ES"キーワードをググるだけ。このアプローチでは、各サービスが同時にパブリッシャーとサブスクライバーになり、サービスの結合を大幅に減らすことができます。

これは、トピックに関する論争に光を当てるマイクロサービスに関する優れた一連の記事です。素敵なイラストで非常に詳細な説明。


2
まあ、まず第一に、「統合データベース」という用語をFowler以外には聞いたことがありません。一人の男がそれを言ったからといって、何かを福音としてとらないでください。第2に、私が「統合データベース」と呼んだものを呼ぶのに十分な情報がありません。第3に、Fowlerは実際に、リンクしたまさに同じ記事で、適切な状況下でそのようなデータベースを有用と呼びます。イベントバスのアイデアは気に入っていますが、効率を上げることができない限り、マイクロサービスの通常のAPIを呼び出すこととの違いはわかりません。
Robert Harvey

ロバートに感謝します。権威から主張するのではなく、アイデアをよりよく説明するためにファウラーの記事をリンクしました。このアプローチの説明は、統合データベースのアプローチと非常によく似ています。それが異なる場合-それはまったく明白ではありません。適切な状況について-データベースを介してマイクロサービスを統合することは、モノリシックアーキテクチャに戻るため、良い考えではないと思います。
IlliakaillI 2017年

1
確かに:各マイクロサービスは、他のサービスのテーブルとは関係のない独自のデータベースまたは同じデータベース内のテーブルと通信します。このようにして、サービスはデータベースを介して情報を交換することはありません。つまり、簡単に水平方向にスケーリングでき、ボトルネックがはるかに少なくなります。また、同じテーブルを共有しないため、アプリの一部での変更が他の部分に影響を与える可能性が低くなります。
IlliakaillI 2017年

1
あなたは絶対的にそれを絶対的に述べることはできません。同じデータベースに同じ情報を必要とするサービスが2つある場合があります。それらはたまにしか必要ありません。そのようにアクセスするためのスケーリングの問題はありません。2つのサービスはすでに他の目的でデータベースにすでにアクセスしているため、サービスバスを立ち上げますまたはそれを達成するだけのAPIエンドポイントはばかげています。
Robert Harvey

1
しかし、ビジネス価値を達成するには、データを結合する必要があります。「次の雨のレーダーデータから、十分な貯水能力がない下水道システムをすべて表示し、その結果を使用してこの自治体のマップに色を付けます」。すべてのデータをサービスに分割した場合、それは後でのみデータを結合できることを意味します。サービスが相互に通信することを禁止する場合は、すべてのデータをクライアントに移動させ、そこにデータを結合させるだけです。データをどこかに結合したいのですが、それが最終的にアプリケーションの価値を与えるものだからです。
RemcoGerlich 2017年

8

SOAについてUdi Dahanが何と言っているかを読むと、多くの非常に優れたアイデアが得られます

サービスは、特定のビジネス機能に対する技術的な権限です。データまたはルールは、1つのサービスのみが所有する必要があります。

これが意味することは、サービスがお互いのイベントをパブリッシュおよびサブスクライブしているときでさえ、すべてのデータとルールに対する信頼できる真実の源が何であるかを常に知っているということです。

また、ビジネス機能のレンズからサービスを見ると、多くのユーザーインターフェイスがさまざまな機能に属する情報、つまり在庫があるかどうかに加えて製品の価格を提示していることがわかります。上記のサービスの定義に準拠するために、これにより、そのようなユーザーインターフェイスは実際にはマッシュアップであることがわかります。各サービスは、特定のデータを処理するUIのフラグメントを持っています。

具体的にはUI組成物に関して、オンマウロServientiの記事UI組成物は、良好な出発点です。こちらから入手できる Udiのビデオも参照してください。

これらのサービスは互いに直接通信できる必要がありますか?もしそうなら、それらはマイクロサービスの概念に反するカップルになるでしょうか?

2つのサービスが相互にメッセージを交換する場合、いくつかのカップリングが発生します。主な答えは、それらが他のサービスのAPIに結合するということです。サービスは、内部が変更されても安定した状態を保つことを約束します。

さらに、サービスディスカバリーのような手法は、特定のサービスプロバイダーへの依存を緩和し、メッセージブローカーはプロデューサーとコンシューマーを分離することができます(メッセージとブローカーのAPIと対話する方法を互いに理解する必要があります-魔法はありません) )。


7

それはあなたが「直接」で何を意味するかによる。

マイクロサービスアーキテクチャによれば、RESTのようなインターフェースを介して、独自のサーバーまたは外部サーバーのいずれかで他のマイクロサービスを呼び出すマイクロサービスを持つことは完全に問題ありません。

うまくいかないのは、1つのマイクロサービスが直接メソッド呼び出しを使用して別のマイクロサービスを呼び出すことです。それは両方のマイクロサービスを同じモノリスの一部にするでしょう。


それは良くなく、悪い結果をもたらすでしょう。詳細については、私の回答を参照してください。
IlliakaillI 2017年

@IlliakaillI「マイクロサービスのアーキテクチャーによれば」それは問題ないと言っています。マイクロサービスアーキテクチャに影響がないこと、またはマイクロサービスアーキテクチャに改善を加えることができないことを示唆していません。ここでの質問は、「Xは本かどうか」ということです。そして正しい答えは、Xの正しい定義が与えられた場合、それは本によるということです。
Mike Nakis、2017年

実際の「マイクロサービスアーキテクチャ」を構築する方法を説明する「リファレンスブック」はありますか?マイクロサービスは最近流行語になり、多くの人々がREST上にモノリスを構築する方法についての本を書きました。私の答えの最初の図を見てください。その方法でシステムを構築することは意味がありません。あなたが何か奇妙な理由でそうするなら-あなたは間違いなくそれを間違ってやっています。代わりにモノリスを使用することをお勧めします。一部の本を盲目的に参照して(権威からの議論を作成して)設計の選択を支持する場合、ソフトウェア設計にアプローチする正しい方法ではありません。
IlliakaillI 2017年

5

これらのサービスは互いに直接通信できる必要がありますか?もしそうなら、それらはマイクロサービスの概念に反するカップルになるでしょうか?

カップリングは悪い言葉ではありません。 すべてのアプリケーションには、すでにある程度の結合があります。マイクロサービスと通信するアプリケーションはすでにマイクロサービスに結合されてます。そうでなければ、機能しません。

マイクロサービスで本当に求めているのは、疎結合です。パブリックAPIを介して、またはイベントバスを使用して、1つのマイクロサービスに他のマイクロサービスを問い合わせさせるだけで、これを実現できます。

ただし実際には、1つ以上のマイクロサービス(おそらくそれらすべて)は、SQLデータベースのようないくつかの中央データストアと通信します。目標をどのように達成したいかに応じて、1つのマイクロサービスに何らかの方法でデータベースデータを変更させるだけで、他のマイクロサービスが変更を取得するためにクエリを実行します。


3
「統合データベース」はよく知られたアンチパターンです。詳細については私の回答を参照してください。
IlliakaillI 2017年

2

SOAやアーキテクチャー全般について話すとき、人々は意味論や専門用語に夢中になっているようです。サービスを「マイクロ」にするものは何ですか?結局のところ、使用している「スコアリングシステム」において、サービスを「非マイクロ」にしないことは、明らかにいくつかの特性のセットです。最高裁判所の判事がわいせつについて何と言ったのですか?「見ればわかるよ」

これは答えではないと言う人もいると思いますが、彼らは要点を逃しています。マイクロサービスアーキテクチャは、「密結合」の問題など、いくつかの問題を回避することを目的としています。したがって、お互いの細かい詳細に依存しているマイクロサービスのもつれを作成することになった場合は、パブ/サブメッセージバスを使用しているか、直接呼び出しを使用しているかにかかわらず、それが破壊される密結合を作成しています。ピースから新しいソリューションを作成したり、システム全体を停止することなく個々のピースを再構成したりする能力など


1

クライアントは、クライアントにWebページをロードするために必要なデータを取得するために、次々にそれらを直接呼び出す必要がありますか?

場合によります; ただし、クライアントに直接使用可能な機能を提供し、結果が(たとえば、複数のマイクロサービスを介して)組み立てられる方法の詳細を非表示(カプセル化)にすることをお勧めします。

クライアントによる個々のマイクロサービスの結果の結合に必要なロジックが多すぎると、一部のビジネスロジックが誤ってクライアントに侵入する可能性があります。また、必要以上に内部アーキテクチャをクライアントに公開し、後でマイクロサービスのリファクタリングを妨げることがあります。

つまり、マイクロサービスの場合、有用な抽象化を備えたエンドポイントをクライアントに提供し、他の(おそらくより多くの内部の)マイクロサービスのより高いレベルの調整を実行するラッパーマイクロサービスがあると便利な場合があります。


(さらに、クライアントへの往復は、マイクロサービスから相互への往復よりもおそらく高価です。)


たとえば、GraphQLが取っている方向を見ると、クライアントがエンドポイントに直接関連するクエリを発行していることがわかります。これは、micrservicesのコレクションとして実装されている場合と実装されていない場合があります。マイクロサービスのアーキテクチャはGraphQLの背後に隠されているため、アーキテクチャのリファクタリングが容易になり、クライアントにとっても使いやすくなります。たとえば、https://stackoverflow.com/a/38079681/471129を参照してください


1

マイクロサービスの主な目的は、アプリケーションを疎結合にすることです。したがって、サービスは互いに呼び出すことができません。それ以外の場合は、密結合されます。しかし、データを共有する必要がある2つのサービスがある場合はどうしますか?答えはメッセージブローカーです。したがって、クライアントからデータを取得するサービスは、中央のメッセージブローカーとデータを共有できます。サービスは、そのデータを使用して、データを消費し、変換して、独自のデータストレージに配置する必要があります。さまざまなトピックのデータをオンザフライでカフカストリームに結合できるので、カフカをお勧めします。PS。マイクロサービスを機能ごとに分離する方が良いでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.