ここでもう少し理論的になると役立つと思います。マイクロサービスの背後にある動機付けのアイデアの1つは、シェアードナッシング、メッセージパッシングプロセスです。マイクロサービスは、アクターモデルのアクターのようなものです。つまり、各プロセスは独自のローカル状態を維持し、1つのプロセスが別のプロセスの状態にアクセスする唯一の方法は、メッセージを送信することです(さらに、他のプロセスはそれらのメッセージが好きでも応答できます)。「すべてのマイクロサービスが独自のデータベースを持っている」とは、プロセス(マイクロサービス)の状態がローカルでプライベートであることを意味します。大部分は、これは「データベース」を連結する必要があることを示唆していますつまり、「データベース」はマイクロサービスと同じ論理ノードで保存および実行する必要があります。マイクロサービスの異なる「インスタンス」は個別のプロセスであるため、それぞれ独自の「データベース」を持つ必要があります。
この観点から、グローバルデータベースまたはマイクロサービス間で共有されるデータベース、またはマイクロサービスのインスタンスでさえ、共有状態を構成します。マイクロサービスの観点からこれを処理する「適切な」方法は、「データベース」マイクロサービスによって共有データベースを仲介することです。データベースの内容を知りたい他のマイクロサービスは、その「データベースマイクロサービス」にメッセージを送信します。これは通常、元のマイクロサービスのローカル状態(つまり、マイクロサービスインスタンスごとの「データベース」)の必要性を排除しません!変更されるのは、そのローカル状態が表すものです。「ユーザーサリーは管理者です」を保存する代わりに、「データベースマイクロサービスは5分前に「ユーザーサリーは管理者です」と言った」を保存します。言い換えると、 他のマイクロサービスの状態について。
この利点は、各マイクロサービスが自己完結型であることです。これにより、マイクロサービスは障害のアトミック単位になります。(ほとんど)部分的に機能している状態のマイクロサービスについて心配する必要はありません。もちろん、問題はマイクロサービスのネットワークに移されました。マイクロサービスは、他のマイクロサービスに接続できないため、目的の機能を実行できない場合があります。ただし、メリットは、マイクロサービスが明確に定義された状態になり、古くなった信念を排除するなどして、劣化したサービスや限定的なサービスを提供できる可能性があることです。欠点は、システム全体の一貫したスナップショットを取得することが非常に難しく、非常に多くの(望ましくない)冗長性と複製が発生する可能性があることです。
もちろん、OracleのインスタンスをすべてのDockerコンテナに固定することは推奨されていません。まず、すべてのマイクロサービスに「データベース」が必要なわけではありません。一部のプロセスは、正常に機能するために永続状態を必要としません。たとえば、2つのプロトコル間で変換するマイクロサービスは、必ずしも永続的な状態を必要としません。永続的状態が必要な場合、「データベース」という言葉は「永続的状態」の単なる言葉です。JSONを含むファイル、またはSqliteデータベース、または必要に応じてローカルで実行されるOracleのコピー、またはその他のローカルの手段を使用できます。データを永続的に保存します。「データベース」がローカルでない場合、純粋なマイクロサービスの観点からは、別個の(マイクロ)サービスのように扱う必要があります。このため、RDSインスタンスをマイクロサービスの「データベース」にすることは意味がありません。繰り返しますが、視点は「独自のRDSデータベースを持つマイクロサービスの束」ではなく、「RDSデータベースと通信するマイクロサービスの束」です。この時点で、データが同じデータベースインスタンスに保存されているかどうかに違いはありません。
実際には、マイクロサービスアーキテクチャは非常に複雑になります。この複雑さは、部分的な障害に真剣に対処するだけの代価です。多くの人にとって、利益に見合う価値がないのは行き過ぎです。最も有益と思われる方法でシステムを自由に設計してください。シンプルさと効率性に関する懸念が、純粋なマイクロサービスアーキテクチャからの逸脱につながる可能性は十分にあります。コストは追加のカップリングであり、サービス間の見えない相互作用や、自由に展開および拡張する自由の制限など、独自の複雑さをもたらします。