web-dev-qa-db-ja.com

マイクロサービスの相互作用とフォーマット

私の会社はサービス指向アーキテクチャーに変換していますが、奇妙なセットアップがあります。たくさんのウェブアプリがあります。現在、これらのWebアプリにはそれぞれ独自のRESTfulマイクロサービスがあります。これらのマイクロサービスは、基本的にはバックエンドの仲介者ですRESTサービスです。これらは一般にパススルーですが、マイクロサービスは、ユーザーの認証/承認、データのフォーマット、データの強化、複数のデータの集約のために作成されましたサービス。いくつか質問があります。

  1. マイクロサービスは相互に通信することになっているといつも思っています。現在、2つの別個のマイクロサービスが同じバックエンドサービスを呼び出す場合があります。これは正しい設計ですか、それとも、バックエンドサービスを呼び出す1つのマイクロサービスAと、Aを呼び出す他の2つのマイクロサービスBおよびCを作成する必要がありますか?

  2. UIからマイクロサービスにいくつかのフォーマットをプッシュしたいと考えています。たとえば、バックエンドサービスAからの電話番号を常にダッシュにフォーマットしたいとします。 5552223333から555-222-3333。パススルーするフォーマットマイクロサービスを用意する必要がありますか、それともバックエンドサービスAを呼び出す各マイクロサービスでフォーマットするのが最善ですか?

  3. 各Webアプリは、特定のマイクロサービスとのみ通信します。 Webアプリは、1つのサービスだけでなく、複数のサービスと通信する必要がありますか?これにより、マイクロサービス全体で見られる重複を取り除くことができます。

同様のデザインを扱う優れたリソースを誰かが持っている場合は、それらについてお読みください。

7
Mike H

マイクロサービスの背後にあるアイデア:

  • 対象となるすべてのクライアントにサービスを公開します。クライアントを追加した場合、バックエンドを書き直す必要はなく、再利用します。
  • 同じインターフェースを公開している限り、他のマイクロサービスを中断することなく実装を置き換えることができます。
  • より多くのリソースが必要な場合は、より多くの種類のマイクロサービスノードを実行したり、別のハードウェアで実行したりすることができるため、システムを再スケーリングせずに、または大規模な再デプロイせずに、システムを簡単にスケーリング/負荷に適応させることができます。
  • 一部のマイクロサービスが利用できなくなった場合、サービス全体に、必要に応じて部分的に機能するオプションがあります。

これを助けるものは何でも良いです。ただし、追加されたオーバーヘッドと複雑さについて覚えておいてください。

さまざまなサービスが同じバックエンドに到達するか、DAGパターンで相互にヒットすることは、単にOKであるだけでなく、その背後にある考え方のようなものです。バックエンドの機能を、それを必要とする他のサービスと共有する方法です。これは、コードの重複や機能の不整合を取り除く方法です。

電話番号のみをフォーマットするRESTfulマイクロサービス全体を実行することはしません。どのくらいの頻度でこの形式を変更しますか?システム全体を再起動せずに変更しますか?より大きなデータ正規化サービスはより合理的に見えます。 RESTfulでないRPC(オーバーヘッドの少ないプロトコルバッファー/ cap'n-proto/thrift)は、非常に軽量な関数のオプションとなる場合があります。

3
9000
  1. マイクロサービスは相互に通信することになっているといつも思っています。現在、2つの別個のマイクロサービスが同じバックエンドサービスを呼び出す場合があります。これは正しい設計ですか、それとも、バックエンドサービスを呼び出す1つのマイクロサービスAと、Aを呼び出す他の2つのマイクロサービスBおよびCを作成する必要がありますか?

Answer 1:マイクロサービスを分割またはマージするか、通信構造を変更するかは、パフォーマンス、セキュリティ、ネットワークとコードのオーバーヘッド、および運用上の制限に関して、何を達成したいかによって異なります。

「バックエンドサービスを呼び出す1つのマイクロサービスAと、Aを呼び出す他の2つのマイクロサービスBおよびCを作成する必要がありますか?」という質問に答えることができます。次のようないくつかの質問に答えてください。

  • どちらかを決定すると、すべてのサービスのパフォーマンスにどのような影響がありますか?
  • どちらかを決定すると、すべてのサービスのセキュリティにどのような影響がありますか?
  • 開発者が推論しやすい、またはコード構造を簡略化するのに役立つ決定はどれですか。
  • どちらかの決定を制限するような制限はありますか(新しいサーバー/コンテナーでのコスト超過、サードパーティサービスからの外部APIレート制限など)?

重要な質問に答えると、特定のサービスを分割する理由または分割しない理由を見つけることができます。

サイド注:マイクロサービスとバックエンドサービスの違いを組織が指定していることは明らかです。時々、組織は間違ったドメイン固有の言語を使用し、開発者が仕事をするのに必要な精神的な柔軟性と両立しない方法で物事をグループ化します。明確にするために:すべてはマイクロサービスです。 RESTインターフェースを「バックエンド」サービスで開くことを恐れないでください。パフォーマンス、セキュリティ、オーバーヘッド、および制限マトリックスがこの決定に有利であれば...別のサービス」

[〜#〜] if [〜#〜]バックエンドサービスの定義が共有データベースまたはキューサービスである場合、マイクロサービスを正しく実行していません。それらすべてのテーブルを、それぞれのサービスに接続されたデータベースインスタンスに分割します。サービスは同じデータベーススキーマを共有するべきではありませんが、定義された(REST/websocket /ネットワーク)インターフェースとデータを共有する必要があります。このシナリオの答えは、「バックエンドサービスを呼び出す1つのマイクロサービスAと、Aを呼び出す他の2つのマイクロサービスBとCを作成する」です。

  1. UIからマイクロサービスにいくつかのフォーマットをプッシュしたいと考えています。たとえば、バックエンドサービスAからの電話番号を常にダッシュにフォーマットしたいとします。 5552223333から555-222-3333。パススルーするフォーマットマイクロサービスを用意する必要がありますか、それともバックエンドサービスAを呼び出す各マイクロサービスでフォーマットするのが最善ですか?

Answer 2共有フォーマット(またはアルゴリズム)を共有モジュールに配置し、変換に最も近いコードにインストールする必要があります。電話番号の解析、フォーマット、および検証に必要なコードを、電話番号を処理する必要がある各マイクロサービスにインストールできる共有モジュールに移動することをお勧めします。

サイド注:共有モジュールのアイデアに同意せず、「電話番号フォーマットサービス」を選択する場合は、それがどのように拡大するかを調べてみましょう。 「アドレスフォーマットサービス」が必要な場合はどうなりますか?これは、すべてのコード、ネットワーク、およびメンテナンスのオーバーヘッドを備えた別個のサービスですか? 「電話番号フォーマットサービス」の新しいRESTエンドポイントを開いて、単一の責任の線をぼかしますか?より簡単な解決策は、新しいコードを含む新しい共有モジュールを作成することです。ネットワーク、およびメンテナンスのオーバーヘッド)、そのモジュール内のすべてのアドレスロジックを分離し、そのロジックを処理する必要があるサービスにそれを含めます

  1. 各Webアプリは、特定のマイクロサービスとのみ通信します。 Webアプリは、1つのサービスだけでなく、複数のサービスと通信する必要がありますか?これにより、マイクロサービス全体で見られる重複を取り除くことができます。

回答3:これは難しい質問です。絶対的で理想的な世界で。各Webアプリのファサードとして1つのマイクロサービスを使用することは正しい決定です。これにより、コアサービスからの不規則なユーザー動作とパフォーマンスの問題が緩和されます。また、コア固有のロジックからクライアント固有のロジックを明確に分離します。

ただし、実際の答えはより有機的です。 Webアプリの開発を開始し、サービスに直接リクエストを送信します。 Webアプリの機能が、各サービスへのポイントツーポイント通信で管理できる範囲を超えて成長した場合は、ファサードを構築します。

多くのエンドポイント/サービスの代わりに、彼らが呼び出すことができる単一の集約エンドポイント/サービスを求めるモバイル開発者が最初に発言する可能性が最も高いでしょう。

サイド注:ここで選択する回答とは関係なく、サービスのコードの重複を取り除く必要があります。サービス全体でコードの重複がある場合は、それを簡略化されたインターフェースを持つ共有モジュールに移動し、そのモジュールをサービスに含めて、重複するコードを削除します。まだコードの重複がありますが、問題の処理方法に関する特定のビジネスロジックではなく(安定性が低い)代わりに、設計したパブリックインターフェイス(安定した)を使用するコードになります

1
alextaujenis