私たちは、複数のデータベースとアプリケーションに分解する必要がある巨大なプロジェクトを持っています。この問題に対する2つの可能なアプローチを考えることができます。
私のリードは本当に、2番目のオプションを使用することを望んでいます。なぜなら、より効果的で弾力性があると彼は考えているからです。このアプローチを使用すると、データが複製されるため、特定のマイクロサービスのすべての依存サービスをスケールアップする必要がありません。また、依存するマイクロサービスが停止している場合でも(データが複製されるため)、必要なデータをフェッチできます。この種のことは私には理にかなっていますが、レプリケーションのバグが神経質になり、適切に実装するのは複雑に思われるため、これは悪い考えであり、適切に実装することは複雑に思われます(データが同期されなくなる可能性のある多くの方法があり、複数のサービスで使用する必要があるすべてのデータを手動で再同期するのは簡単です。 #2で述べたようなアーキテクチャで作業したことがないので、ここで完全にベースから外れる可能性があります。そのため、ここに投稿してアドバイスを求めています。皆さんは何をお勧めしますか? #1か2か?他に完全に何か?前もって感謝します!
推奨されるアプローチは、いくつかの要因に依存します。私の会社では、両方のアプローチ(非同期通信のキューではなく Hermes を使用)を使用しています。どちらのアプローチも、特定の状況で利点があるためです。
関心のある主な要素は、特定のサービスのペアのデータの鮮度にどのような要件があるかです。基本的に、非同期通信(キューの使用など)には、サービス間のカップリングが少なく、スループットが向上するという利点があります。都合の良いときにデータ転送をスケジュールしたり、失敗した送信を何度でも繰り返したりできるためです。欠点は、物事が非同期に発生するため、あるサービスが他のサービスから更新を取得する前に古いデータを参照するため、常に遅延が発生することです。また、各サービスで大きなデータベースを複製する場合は、かなりのディスクおよびCPUリソースが必要になる場合があります。
また、分散システムでは、「データを別の場所にコピーする」のと同じくらい簡単なことは難しいことに注意してください。アプリケーションAの1つのインスタンスとアプリケーションBの1つのインスタンスがあり、すべてが同期的に発生する場合、サービスAからサービスBへのすべてのデータの真のコピーを作成して同期を保つことができます。 BのMインスタンス、そしてさらに悪いことに、通信は非同期であり、最新のコピーを保持することは本当に困難です。たとえば、インスタンスA1がドキュメントを更新し、インスタンスA2も同じドキュメントを更新すると、インスタンスB1とB2に到達するために2つの更新イベントが競合し、それらを任意の順序で受信して適用できます。これは大きなトピックですが、重要なのは、複雑さが大きくなることです。
したがって、ここでは、各アプローチを使用する方が良い選択の例をいくつか示します。
ご覧のとおり、両方のアプローチには適切なユースケースがあり、大規模なシステムでは、状況に応じて#1または#2のハイブリッドアプローチを使用することで解決する必要があります。