web-dev-qa-db-ja.com

マイクロサービス全体で共有データを処理するにはどうすればよいですか?

私の仕事には典型的なマイクロサービスアーキテクチャがありますが、私たちが直面している問題の1つは複数のサービス間でデータを共有することです。複数のサービスで使用される特定のデータがあるため、サービス間でデータを共有する必要があります。参考までに、データベースはサービスごとに分けられています。

例として、ユーザーサービス、通信サービス、報酬サービスがあります。ユーザーサービスには、言語設定や特典レベルなど、すべてのユーザーデータが保存されます。通信サービスと報酬サービスにはそのデータが必要です。データは基本的にユーザーモデルのプロパティであるため、データはユーザーサービスに格納されます。これにより、格納されているマイクロサービスの外部のデータにアクセスする必要があります。適切なサービスに格納されている場合でも、ユーザーモデルに対してGETを実行すると、このデータが返される必要があるため、同じ問題が発生します。 。

現在、そのデータのサービスに対してGETクエリを実行することにより、データが共有されています。しかし、これは本当に素朴なようで、主に「最も簡単な解決策」として行われました。

これに加えて、一貫性を維持する必要があるデータの一部には特定の要件があります。当社には、ユーザーに優先言語で通信する法的義務があります。同様に、間違った階層から適用された報酬は問題のように聞こえます(おそらくそれは重大な問題ではありません)。

このデータの共有を適切に処理するにはどうすればよいですか?

考えられるプロセスの1つは、データベースへの読み取り接続を共有することです。読み取りは非常に適切にスケーリングされ、ユーザーサービスのみがデータを更新する必要があります。確かなサービス間でGETを実行するよりも高速です。私がデータベース接続の共有のファンであるかどうかははっきりとはわかりませんが、おそらく読み取りだけではそれほど悪くはありません。

もう1つは、データを格納してそれに公開する共有サービスを作成することですが、このデータが伝播遅延を引き起こすことは問題があるようです。私たちはいくつかのデータを同期させる義務を負っており、伝播に関する問題は大きな問題になる可能性があります。データの同期が数秒間だけずれている場合は、大した問題ではない可能性があります。タイミングの問題で誰かが間違った報酬を受け取った場合、それはそれほど悪いことではないかもしれません。または、送信されたとおりに通信が基本的に正しい場合、通信は間違った言語で行われます。絶対に共有しなければならないことが重要であるかどうかはわかりません。

3つ目は、共有されているキャッシュサービスを使用することです。キャッシュにはredisがあるため、データをそこに格納し、キャッシュミスのクエリサービスのみを格納できます。これにより、複数回クエリを実行するデータの検索が大幅に高速化されますが、キャッシュに大量のデータが必要かどうかはわかりません。十分に保存しないと、頻繁に見落とされる可能性があります。

もう1つは、データが重要なマイクロサービスにデータを保存することです。これの問題は、真理値ストアがユーザーモデルであることを暗示することです。そのため、API呼び出しによってデータが更新されると、マイクロサービスが更新されますが、データへのGETは一時的に古いデータを返します。

これは新しい問題ではないと確信していますが、これに対処するための最良の方法はわかりません。私たちの現在のソリューションが理想的ではなく、拡張できないと確信していますが、どちらのアプローチが最適であるかはわかりません。

4
Michael Yousef

私が見たソリューションの1つは、共有データをイベントソースの集約に移動し、このデータを必要とするすべてのサービスで公開できるようにすることです。 KafkaまたはEventstoreを使用してそれらを保存できます。Kafkaの場合、eventsourcedトピックは、ストリームAPIを介して別のマイクロサービスによって使用されます。実際の状態と、状態を変更する新しいイベントも、クライアントへのストリームメッセージとして自然に送られます。つまり、別のサービスへの直接クエリがなく、データの複製やデータの更新が何らかの意味で反応することはありません。

しかし、このパターンは馴染みがなく、多くのプログラマにとって異質です。Kafkaは重いサービスであり、プログラマにopsの負担と認知的負荷をもたらします。そのため、代替として、共有データベースのアイデアが好きです。 -単一のライターの原則として厳格な制限を要求します。他のマイクロサービスはすべてのテーブルにクエリを実行できますが、それらに属するテーブルにのみ書き込むことができます。データベースの権限は、アクセスルールの適用に役立つ場合があります。

私はマイクロサービスの世界にはかなり慣れていないので、たくさんの塩を使って私の言葉を聞いてください。 :)

1
user6389186