web-dev-qa-db-ja.com

モノリシックアプリケーションをいくつかのマイクロサービスに分割するには、どのアプローチを使用すればよいですか?

私たちは、複数のデータベースとアプリケーションに分解する必要がある巨大なプロジェクトを持っています。この問題に対する2つの可能なアプローチを考えることができます。

  1. 各サービスでRESTエンドポイントを使用してデータをフェッチ/更新します。相互に依存しているサービスは、お互いのRESTエンドポイントを呼び出してデータをフェッチ/更新します。 (これは私にとって最も理にかなっており、各サービスが「所有」することになっているデータに関して、懸念を適切に分離しているようです)
  2. キューを使用して、サービス間で「エンティティ更新」メッセージを渡し、データを必要とするすべてのサービス間で更新されたデータを複製します。

私のリードは本当に、2番目のオプションを使用することを望んでいます。なぜなら、より効果的で弾力性があると彼は考えているからです。このアプローチを使用すると、データが複製されるため、特定のマイクロサービスのすべての依存サービスをスケールアップする必要がありません。また、依存するマイクロサービスが停止している場合でも(データが複製されるため)、必要なデータをフェッチできます。この種のことは私には理にかなっていますが、レプリケーションのバグが神経質になり、適切に実装するのは複雑に思われるため、これは悪い考えであり、適切に実装することは複雑に思われます(データが同期されなくなる可能性のある多くの方法があり、複数のサービスで使用する必要があるすべてのデータを手動で再同期するのは簡単です。 #2で述べたようなアーキテクチャで作業したことがないので、ここで完全にベースから外れる可能性があります。そのため、ここに投稿してアドバイスを求めています。皆さんは何をお勧めしますか? #1か2か?他に完全に何か?前もって感謝します!

4
Ben

推奨されるアプローチは、いくつかの要因に依存します。私の会社では、両方のアプローチ(非同期通信のキューではなく Hermes を使用)を使用しています。どちらのアプローチも、特定の状況で利点があるためです。

関心のある主な要素は、特定のサービスのペアのデータの鮮度にどのような要件があるかです。基本的に、非同期通信(キューの使用など)には、サービス間のカップリングが少なく、スループットが向上するという利点があります。都合の良いときにデータ転送をスケジュールしたり、失敗した送信を何度でも繰り返したりできるためです。欠点は、物事が非同期に発生するため、あるサービスが他のサービスから更新を取得する前に古いデータを参照するため、常に遅延が発生することです。また、各サービスで大きなデータベースを複製する場合は、かなりのディスクおよびCPUリソースが必要になる場合があります。

また、分散システムでは、「データを別の場所にコピーする」のと同じくらい簡単なことは難しいことに注意してください。アプリケーションAの1つのインスタンスとアプリケーションBの1つのインスタンスがあり、すべてが同期的に発生する場合、サービスAからサービスBへのすべてのデータの真のコピーを作成して同期を保つことができます。 BのMインスタンス、そしてさらに悪いことに、通信は非同期であり、最新のコピーを保持することは本当に困難です。たとえば、インスタンスA1がドキュメントを更新し、インスタンスA2も同じドキュメントを更新すると、インスタンスB1とB2に到達するために2つの更新イベントが競合し、それらを任意の順序で受信して適用できます。これは大きなトピックですが、重要なのは、複雑さが大きくなることです。

したがって、ここでは、各アプローチを使用する方が良い選択の例をいくつか示します。

  • ユーザーとそのアクセス権に関する情報を含む承認サービスがあります。ここでRESTが推奨されます:ユーザーのアクセス許可の削除などの変更をすぐにアクティブにする必要があります。セキュリティ上の理由から、ユーザーの個人情報のコピーも作成したくないまたは資格情報。
  • このサービスは、Webショップが販売している特定の製品の広告を表示します。各製品の広告には、名前、簡単な説明、リンクURLが含まれています。宣伝されている製品の数がそれほど多くないと仮定すると、非同期通信を介してコピーを作成することが望ましい場合があります。製品は頻繁には更新されません。更新されている場合、変更が広告に表示されるまでに数分の遅延を追加することは許容されます。広告サーバーは、広告配信のパフォーマンスに合わせて調整された特別な形式で広告をインデックスに登録する場合があり、サービスは疎結合です。広告サービスは、RESTリクエスト。
  • ショップのリストページには、販売している商品が表示されます。ここでは、おそらくRESTを介して製品データベースサービスに直接クエリを実行します。商品を編集するときは、変更をできるだけ早くショップのページに表示する必要があります。製品データベース全体はおそらく非常に大きいため、フロントエンドサービスでデータベースを複製すると、ハードウェアのコストが高くなります。

ご覧のとおり、両方のアプローチには適切なユースケースがあり、大規模なシステムでは、状況に応じて#1または#2のハイブリッドアプローチを使用することで解決する必要があります。

5