Book Buildingマイクロサービスは、@ RogerAlsingが彼の回答で述べたスタイルを詳細に説明しています。
43ページの「オーケストレーションvsコレオグラフィー」で、この本はこう書いています:
ますます複雑なロジックのモデリングを開始するにつれ、個々のサービスの境界にまたがるビジネスプロセスの管理の問題に対処する必要があります。マイクロサービスを使用すると、通常より早くこの制限に達します。[...]このフローを実際に実装することになると、従うことができるアーキテクチャの2つのスタイルがあります。オーケストレーションでは、オーケストラの指揮者のように、中央の脳を使用してプロセスをガイドおよび駆動します。振付では、システムの各部分にその仕事を通知し、ダンサー全員が自分の道を見つけ、バレエの周りの他の人に反応するように、詳細を計算させます。
次に、本は2つのスタイルを説明します。オーケストレーションスタイルは、オーケストレーション/タスクサービスというSOAのアイデアにより対応していますが、コレオグラフィスタイルは、Martin Fowlerの記事で言及されているダムパイプとスマートエンドポイントに対応しています。
オーケストレーションスタイル
このスタイルで、上記の本は次のように述べています:
このフローのオーケストレーションソリューションがどのようになるかを考えてみましょう。ここで、おそらく最も簡単なことは、カスタマーサービスを中心的な脳として機能させることです。作成時には、一連のリクエスト/レスポンスコールを通じて、ポイントポイントの銀行、メールサービス、郵便サービスと通信します[...]。その後、顧客サービス自体が、顧客がこのプロセスのどこにいるかを追跡できます。お客様のアカウントが設定されているか、メールが送信されているか、投稿が配信されているかを確認できます。フローチャート[...]を取得して、コードに直接モデル化します。これを実装するツールを使用して、適切なルールエンジンを使用することもできます。ビジネスプロセスモデリングソフトウェアの形で、まさにこの目的のための商用ツールが存在します。同期リクエスト/レスポンスを使用すると仮定すると、各段階が機能しているかどうかを知ることもできます[...]このオーケストレーションアプローチの欠点は、カスタマーサービスが中央の統治機関になりすぎる可能性があることです。これは、Webの真ん中のハブになり、ロジックが機能し始める中心点になります。このアプローチの結果、少数のスマートな「神」サービスが貧血のCRUDベースのサービスに何をすべきかを指示するのを見てきました。
注:著者がツールについて言及するとき、彼はBPMのようなもの(例:Activity、Apache ODE、Camunda)について言及していると思います。実際のところ、Workflow Patterns Webサイトには、この種のオーケストレーションを行うための素晴らしい一連のパターンがあり、この方法での実装に役立つさまざまなベンダーツールの評価の詳細も提供されています。著者がこれらのツールのいずれかを使用してこの統合スタイルを実装する必要があることを示唆しているとは思わないが、他の軽量オーケストレーションフレームワーク、たとえばSpring Integration、Apache CamelまたはMule ESBを使用することもできる
ただし、マイクロサービスのトピックについて私が読んだ他の本、および一般にWebで見つけた記事の大部分は、このオーケストレーションのアプローチを嫌い、代わりに次のものを使用することを提案しているようです。
振付スタイル
振付スタイルの下で著者は言う:
振り付けのアプローチでは、代わりに、カスタマーサービスが非同期でイベントを発行するようにできます。次に、電子メールサービス、郵便サービス、およびポイントサーバーは、これらのイベントをサブスクライブし、それに応じて対応します[...]このアプローチは、さらに分離されています。他のサービスが顧客の作成に到達する必要がある場合は、イベントをサブスクライブし、必要に応じてその仕事を行うだけです。欠点は、[ワークフロー]に表示されるビジネスプロセスの明示的なビューが暗黙的にシステムにのみ反映されることです[...]これは、適切なものがあることを監視および追跡できるようにするために追加の作業が必要であることを意味します起こりました。例えば、ポイントポイントの銀行にバグがあり、何らかの理由で正しいアカウントが設定されなかったかどうかを知っていますか?これに対処するために私が好む1つのアプローチは、[ワークフロー]のビジネスプロセスのビューに明示的に一致する監視システムを構築することですが、各サービスが独立したエンティティとして実行することを追跡し、奇数の例外がより明示的なプロセスフロー。[フローチャート] [...]は駆動力ではなく、システムの動作を確認できる1つのレンズです。一般に、振付アプローチに向かう傾向のあるシステムは、より疎結合であり、より柔軟で変更が可能であることを発見しました。ただし、システムの境界を越えてプロセスを監視および追跡するには、追加の作業を行う必要があります。最も調整が進んだ実装は非常に壊れやすく、変更のコストが高くなることがわかりました。それを念頭に置いて、各サービスがダンス全体での役割を理解するのに十分なほど賢い振付システムを目指すことを強く好みます。
注:今日まで、コレオグラフィーがイベント駆動型アーキテクチャー(EDA)の別名にすぎないかどうかはまだわかりませんが、EDAがその1つの方法に過ぎない場合、他の方法は何ですか?(も参照してくださいあなたは、「イベントドリブン」とはどういう意味ですか?とイベント駆動型アーキテクチャの意味)。また、CQRSやEventSourcingのようなものは、このアーキテクチャスタイルに大きく共鳴しているようですね。
さて、これからが楽しみです。マイクロサービスの本は、マイクロサービスがRESTで実装されることを想定していません。本の次のセクションの実際の問題として、彼らはRPCとSOAベースのソリューションを検討し、最後にRESTを検討します。ここで重要な点は、マイクロサービスはRESTを意味しないということです。
それで、HATEOASはどうですか? (アプリケーション状態のエンジンとしてのハイパーメディア)
RESTfulなアプローチを採用したい場合、HATEOASを無視することはできません。RoyFieldingは彼のブログで、私たちのソリューションが本当にRESTではないことを非常に喜んで言っています。REST APIに関する彼のブログ投稿を参照してください。ハイパーテキスト駆動である必要があります。
HTTPベースのインターフェースをREST APIと呼ぶ人々の数に不満を感じています。ハイパーテキストが制約であるという概念でRESTアーキテクチャスタイルを明確にするために何をする必要がありますか?言い換えると、アプリケーション状態のエンジン(つまりAPI)がハイパーテキストによって駆動されていない場合、RESTfulにすることもREST APIにすることもできません。限目。どこかに修正が必要な壊れたマニュアルはありますか?
ご覧のとおり、FieldingはHATEOASなしではRESTfulアプリケーションを本当に構築していないと考えています。フィールディングにとって、HATEOASは、サービスのオーケストレーションについての道のりです。私はこれらすべてを学んでいるだけですが、HATEOASは実際にリンクをたどる背後にある原動力は誰であるか、または何であるかを明確に定義していません。ユーザーの可能性があるUIでも、コンピューター間の対話では、より高いレベルのサービスで実行する必要があると思います。
HATEOASによると、APIコンシューマが本当に知る必要がある唯一のリンクは、サーバーとの通信を開始するものです(例:POST / order)。この時点から、RESTはフローを実行します。これは、このエンドポイントの応答で、返されるリソースに次の可能な状態へのリンクが含まれるためです。次に、APIコンシューマーはどのリンクをたどるかを決定し、アプリケーションを次の状態に移行します。
それがいかにクールに聞こえても、クライアントはリンクがPOSTされ、PUTされ、GETされ、PATCHされる必要があるかどうかを知る必要があります。また、クライアントは渡すペイロードを決定する必要があります。それでもクライアントは、失敗した場合の対処方法(再試行、補正、キャンセルなど)を認識する必要があります。
私はこれらすべてにかなり慣れていませんが、HATEOAの観点から見ると、このクライアントまたはAPIコンシューマーは高次のサービスです。人間の観点から考えると、Webページのエンドユーザーがどのリンクをたどるかを想像できますが、それでも、Webページのプログラマーは、リンクを呼び出すために使用する方法を決定する必要がありました。渡すペイロード。つまり、私の指摘では、コンピュータ間の相互作用では、コンピュータがエンドユーザーの役割を果たします。もう一度、これをオーケストレーションサービスと呼びます。
HATEOASはオーケストレーションまたは振付のどちらでも使用できると思います。
APIゲートウェイパターン
別の興味深いパターンが、API Gatewayパターンと呼ばれるものを提案したChris Richardsonによって提案されています。
モノリシックアーキテクチャでは、Webブラウザやネイティブアプリケーションなどのアプリケーションのクライアントが、ロードバランサを介して、アプリケーションの同一のインスタンスの1つにHTTPリクエストを送信します。しかし、マイクロサービスアーキテクチャでは、モノリスはサービスのコレクションに置き換えられました。したがって、私たちが回答する必要がある重要な質問は、クライアントが何と対話するかです。
ネイティブモバイルアプリケーションなどのアプリケーションクライアントは、個々のサービスに対してRESTful HTTPリクエストを作成できます[...]表面的には、これは魅力的に思えるかもしれません。ただし、個々のサービスのAPIとクライアントが必要とするデータとの間には、細分性に大きなミスマッチがある可能性があります。たとえば、1つのWebページを表示するには、多数のサービスの呼び出しが必要になる可能性があります。たとえば、Amazon.comは、
一部のページが100以上のサービスへの呼び出しを必要とする方法を説明しています。高速インターネット接続であっても、それだけ多くの要求を行うと、低帯域幅で待機時間が長いモバイルネットワークはもちろん、非常に非効率になり、ユーザーエクスペリエンスが低下します。
はるかに優れたアプローチは、クライアントがページごとに少数のリクエスト(おそらく1つ)を、インターネット経由でAPIゲートウェイと呼ばれるフロントエンドサーバーに要求することです。
APIゲートウェイは、アプリケーションのクライアントとマイクロサービスの間にあります。クライアントに合わせたAPIを提供します。APIゲートウェイは、モバイルクライアントに粗粒度のAPIを提供し、高性能ネットワークを使用するデスクトップクライアントに細粒度のAPIを提供します。この例では、デスクトップクライアントは製品に関する情報を取得するために複数の要求を行いますが、モバイルクライアントは単一の要求を行います。
APIゲートウェイは、高性能LAN経由でいくつかのマイクロサービスにリクエストを送信することにより、着信リクエストを処理します。たとえば、Netflixは、
各リクエストが平均して6つのバックエンドサービスにファンアウトする方法を説明しています。この例では、デスクトップクライアントからのきめ細かいリクエストは対応するサービスにプロキシされるだけですが、モバイルクライアントからのきめ細かいリクエストはそれぞれ、複数のサービスを呼び出した結果を集約することによって処理されます。
APIゲートウェイはクライアントとアプリケーション間の通信を最適化するだけでなく、マイクロサービスの詳細もカプセル化します。これにより、クライアントに影響を与えることなくマイクロサービスを進化させることができます。たとえば、2つのマイクロサービスがマージされる場合があります。別のマイクロサービスが2つ以上のサービスに分割されている可能性があります。これらの変更を反映するには、APIゲートウェイのみを更新する必要があります。クライアントは影響を受けません。
APIゲートウェイがアプリケーションとそのクライアントの間で仲介する方法を確認したので、マイクロサービス間の通信を実装する方法を見てみましょう。
これは、上記のオーケストレーションスタイルに非常に似ていますが、意図が少し異なります。この場合、パフォーマンスとインタラクションの簡素化がすべてのようです。