マイクロサービス用にRESTとメッセージングを組み合わせることは可能ですか?

アルテムアントネンコ

マイクロサービスアーキテクチャに基づくアプリケーションの最初のバージョンがあります。外部および内部の通信にはRESTを使用しました。

ここで、CP(CAP定理)*からAPに切り替え、マイクロサービス間の通信にメッセージバスを使用します。Kafka、RabbitMQなどに基づいてイベントバスを作成する方法については多くの情報があります。しかし、RESTとメッセージングの組み合わせのベストプラクティスは見つかりません。たとえば、自動車サービスを作成し、さまざまな自動車コンポーネントを追加する必要があるとします。この目的のために、POST要求でRESTを使用する方が理にかなっています。一方、車を予約するためのサービスは、イベントベースのアプローチには適しています。

辞書とビジネスロジックの機能が異なる場合、同様のアプローチがありますか?それらをどのように組み合わせるのですか?両方のアプローチを別々にサポートするだけですか?または、1つのアプローチでそれらを統合しますか?

*最初のバージョンでは、一貫性とパーティションの許容範囲を選択することに同意しました。しかし今では、可用性が私たちにとってより重要になっています。

ジョージストッカー

結論:コマンドクエリの責任の分離を探しています。これは、データのクエリから実行するプロセスの要求までの責任を分割するためのアーキテクチャパターンを定義します。簡単に言うと、クエリまたはプロセスのいずれかで2つをブロック的に混在させたくないということです。この回答の残りの部分では、その理由と、実行しようとしていることを実行できる3つの異なる方法について詳しく説明します。

この回答は、マイクロサービスでの経験の短い形式です。私の善意:マイクロサービストポロジをゼロから作成し(そして知識はほとんどゼロ)、彼らが言うように、途中ですべてのブランチにヒットしました。

ゼロ知識から始めることの利点の1つは、私が作成した最初のトポロジで、サービス内同期およびブロッキング(HTTP)通信(操作に必要なデータを保持しているサービスから取得するため)とメッセージキューを組み合わせて使用​​したことです。 +操作を実行するための非同期イベント(コマンド用)。

両方の用語を定義します。

コマンド:サービスに何かをするように指示します。たとえば、「ETLバッチジョブの実行」です。これからの出力があることを期待します。しかし、それは必然的にあなたが確実に待つことができないであろうプロセスです。コマンドには副作用があります。このアクションにより、何かが変化します(何も起こらず、何も変化しない場合は、何もしていません)。

クエリ:保持しているデータをサービスに要求します。このデータは、コマンドが与えられたために存在した可能性がありますが、データ要求しても副作用はありませんクエリを受信したため、コマンド操作を実行する必要ありません

とにかく、トポロジーに戻ります。

レベル1:HTTPとイベントの混合

この最初のトポロジでは、同期クエリと非同期イベントの発行を混合しました。これは...問題がありました。

メッセージバスは本質的に観察可能です。RabbitMQの1つの設定、またはイベントソースであり、システム内のすべてのイベントを監視できます。これにはいくつかの良い副作用があります。プロセスで何かが発生すると、通常、どのイベントがその状態につながったかを把握できます(イベント駆動型パラダイム+ステートマシンに従う場合)。

HTTP呼び出しは、ネットワークトラフィックを検査するか、それらの要求をログに記録しないと監視できません(これ自体に問題があるため、通常の操作では「実行不可能」から始めます)。したがって、メッセージベースのプロセスとHTTP呼び出しを混在させると、何が起こっているのかわからない穴ができてしまいます。ネットワークエラーが原因でHTTP呼び出しがデータを返さず、そのためにサービスがプロセスを続行しなかった場所があります。また、HTTP呼び出しの再試行/サーキットブレーカーパターンを接続して、少なくとも数回試行するようにする必要がありますが、「ダウンしているためアップしない」と「一時的にビジーであるためアップしない」を区別する必要があります。 "。

つまり、コマンド駆動型プロセスで2つの方法を組み合わせると、回復力が低下します。

レベル2:イベントはデータのRPC /内部要求/応答を定義します。クエリは外部です

この成熟度モデルのステップ2では、コマンドとクエリを分離します。コマンドはイベント駆動型システムを使用する必要があり、クエリはHTTPを介して発生する必要があります。コマンドのクエリの結果が必要な場合は、メッセージを発行し、メッセージバスを介して要求/応答パターンを使用します。

これには利点と問題もあります。

利点に関しては、コマンドが複数のサービスをホップしている場合でも、コマンド全体を監視できるようになりました。イベントを再実行することでシステム内のプロセスを再生することもできます。これは、問題の追跡に役立ちます。

問題に関しては、イベントの一部がクエリによく似ています。これで、HTTPでメッセージに使用できる美しいHTTPおよびRESTセマンティクスを再作成しています。そして、それはひどく楽しくも便利でもありません。例として、404はRESTにデータがないことを示します。メッセージベースのイベントの場合、それらのセマンティクスを再作成する必要があります(私が見つけることができない主題についての良いYoutube会議の話がありますが、チームはそれを非常に苦労してやろうとしました)。

ただし、イベントは非同期で非ブロッキングになり、すべてのサービスは、特定のイベントに応答するステートマシンにリファクタリングできます。いくつかの注意点は、これらのイベントには操作に必要なすべてのデータが含まれている必要があることです(これにより、プロセスの過程でメッセージが大きくなります)。

クエリは引き続き外部通信にHTTPを使用できます。ただし、内部コマンド/プロセスの場合は、メッセージバスを使用します。

このアプローチもお勧めしません(最初のアプローチからのステップアップですが)。イベントが不純になり始めるため、お勧めしません。マイクロサービスシステムでは、システム全体で契約が同じであることが重要です。

レベル3:データのプロデューサーはデータをイベントとして発行します。消費者は使用するためにデータを記録します。

成熟度モデルの3番目のステップ(およびプロジェクトを離れたときにそのパラダイムに向かっていた)は、データを生成するサービスが、そのデータが生成されたときにイベントを発行することです。次に、そのデータは、それらのイベントをリッスンしているサービスによって書き留められ、それらのサービスは、その(可能性がありますか?)古いデータを使用して操作を実行します。外部のお客様は引き続きHTTPを使用しています。ただし、内部的には、新しいデータが生成されたときにイベントを発行し、そのデータを処理する各サービスは、必要なときに使用するためにデータを保存します。これは、MichaelBryzekの講演「マイクロサービスアーキテクチャの正しい設計」の核心ですMichael Bryzekは、ホワイトレーベルのeコマース企業であるFlow.ioのCTOです

他の問題と一緒にもっと深い答えが必要な場合は、このテーマに関する私のブログ投稿を紹介します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

コパイロットのメッセージングサービスを利用する際に使用するFrom番号を特定することは可能ですか

分類Dev

マイクロサービスおよびJWTと組み合わせてAPIGatewayを使用するにはどうすればよいですか?

分類Dev

組み合わせをチェックするifステートメントを簡略化することは可能ですか?

分類Dev

組み合わせをチェックするifステートメントを簡略化することは可能ですか?

分類Dev

プリプロセッサを使用せずにCSSクラスを組み合わせることによるより迅速なコーディング

分類Dev

グループ通信サービスまたはpaxosでメッセージをログに記録し続けることは実用的ですか?

分類Dev

独自のサーバーを維持せずにGCM(グーグルクラウドメッセージング)を実装することは可能ですか?

分類Dev

マングースでANDとORを組み合わせる方法は?

分類Dev

CPUとGPUグラフィックを組み合わせてパフォーマンスを向上させるにはどうすればよいですか?

分類Dev

カーネルをマッピングせずにプロセスをメモリにマッピングすることは可能ですか?

分類Dev

メッセージブローカーなしで、API統合(WebClientを直接使用)のためのリアクティブアプローチマイクロサービスを使用することにリスクはありますか?

分類Dev

NestJS-マイクロサービスでHTTPとRabbitMQを組み合わせる

分類Dev

2つのインターネット接続を使用し、それらのアップロードを組み合わせてビットトレントにすることは可能ですか?

分類Dev

ValueErrorを修正する方法:分類メトリックは、モデルのマルチクラスターゲットとマルチラベルインジケーターターゲットの組み合わせを処理できませんか?

分類Dev

どのように私はPythonのデータフレームのインデックスを組み合わせることができますか?

分類Dev

整数セッターとバインディングセッターを組み合わせて、XAMLとC#でも使用できるクラスにするにはどうすればよいですか?

分類Dev

Pythonでは、文字列とパーセンテージの両方のフォーマットメカニズムをどのように組み合わせることができますか?

分類Dev

段落内でツールチップタグと段落マージンタグを組み合わせるにはどうすればよいですか?

分類Dev

アンドロイドはFirebaseメッセージングサービスを拡張することはできません

分類Dev

Javaのメインブロックと静的ブロックなしでコンソールにメッセージを印刷することは可能ですか?

分類Dev

ZF2のコントローラーテスト用にMockeryでshouldReceiveとshouldNotReceiveをDoctrineEntity Managerと組み合わせることができますか?

分類Dev

Pythonの列インデックスを使用して条件ステートメントを組み合わせることができますか?

分類Dev

「元に戻す」を別の組み合わせにマップすることは可能ですか?

分類Dev

以前のマージのサブセットとしてのみ存在する特定のリビジョンをマージすることは可能ですか?

分類Dev

同じ値を使用するノックアウトバインディングを組み合わせることは可能ですか?

分類Dev

ヒッコリーライブラリを使用して、セレクターをジッパーと組み合わせて使用することは可能ですか?

分類Dev

与えられたドロップダウンメニューから選択されたすべての可能な組み合わせについて、ウェブサイトから結果を「スクレイプ」するPythonプログラムを作成するにはどうすればよいですか?

分類Dev

IntelSDEでCPUIDと命令セットエミュレーション引数を組み合わせることは可能ですか?

分類Dev

IntelSDEでCPUIDと命令セットエミュレーション引数を組み合わせることは可能ですか?

Related 関連記事

  1. 1

    コパイロットのメッセージングサービスを利用する際に使用するFrom番号を特定することは可能ですか

  2. 2

    マイクロサービスおよびJWTと組み合わせてAPIGatewayを使用するにはどうすればよいですか?

  3. 3

    組み合わせをチェックするifステートメントを簡略化することは可能ですか?

  4. 4

    組み合わせをチェックするifステートメントを簡略化することは可能ですか?

  5. 5

    プリプロセッサを使用せずにCSSクラスを組み合わせることによるより迅速なコーディング

  6. 6

    グループ通信サービスまたはpaxosでメッセージをログに記録し続けることは実用的ですか?

  7. 7

    独自のサーバーを維持せずにGCM(グーグルクラウドメッセージング)を実装することは可能ですか?

  8. 8

    マングースでANDとORを組み合わせる方法は?

  9. 9

    CPUとGPUグラフィックを組み合わせてパフォーマンスを向上させるにはどうすればよいですか?

  10. 10

    カーネルをマッピングせずにプロセスをメモリにマッピングすることは可能ですか?

  11. 11

    メッセージブローカーなしで、API統合(WebClientを直接使用)のためのリアクティブアプローチマイクロサービスを使用することにリスクはありますか?

  12. 12

    NestJS-マイクロサービスでHTTPとRabbitMQを組み合わせる

  13. 13

    2つのインターネット接続を使用し、それらのアップロードを組み合わせてビットトレントにすることは可能ですか?

  14. 14

    ValueErrorを修正する方法:分類メトリックは、モデルのマルチクラスターゲットとマルチラベルインジケーターターゲットの組み合わせを処理できませんか?

  15. 15

    どのように私はPythonのデータフレームのインデックスを組み合わせることができますか?

  16. 16

    整数セッターとバインディングセッターを組み合わせて、XAMLとC#でも使用できるクラスにするにはどうすればよいですか?

  17. 17

    Pythonでは、文字列とパーセンテージの両方のフォーマットメカニズムをどのように組み合わせることができますか?

  18. 18

    段落内でツールチップタグと段落マージンタグを組み合わせるにはどうすればよいですか?

  19. 19

    アンドロイドはFirebaseメッセージングサービスを拡張することはできません

  20. 20

    Javaのメインブロックと静的ブロックなしでコンソールにメッセージを印刷することは可能ですか?

  21. 21

    ZF2のコントローラーテスト用にMockeryでshouldReceiveとshouldNotReceiveをDoctrineEntity Managerと組み合わせることができますか?

  22. 22

    Pythonの列インデックスを使用して条件ステートメントを組み合わせることができますか?

  23. 23

    「元に戻す」を別の組み合わせにマップすることは可能ですか?

  24. 24

    以前のマージのサブセットとしてのみ存在する特定のリビジョンをマージすることは可能ですか?

  25. 25

    同じ値を使用するノックアウトバインディングを組み合わせることは可能ですか?

  26. 26

    ヒッコリーライブラリを使用して、セレクターをジッパーと組み合わせて使用することは可能ですか?

  27. 27

    与えられたドロップダウンメニューから選択されたすべての可能な組み合わせについて、ウェブサイトから結果を「スクレイプ」するPythonプログラムを作成するにはどうすればよいですか?

  28. 28

    IntelSDEでCPUIDと命令セットエミュレーション引数を組み合わせることは可能ですか?

  29. 29

    IntelSDEでCPUIDと命令セットエミュレーション引数を組み合わせることは可能ですか?

ホットタグ

アーカイブ