web-dev-qa-db-ja.com

マイクロサービスでのセッション管理

次の設定があります。

  1. STM(Stingrey Traffic Manager)はロードバランシング+セッションスティッキを行います
  2. Weblogic「クラスター」
  3. サードパーティツールで処理される認証

したがって、水平スケーリング/アプリケーションの複数のインスタンスの実行に関して、セッションについて心配する必要はありません。 STM/Weblogicクラスターは、後続のリクエストが同じ管理対象サーバーに確実に届くようにします。

私たちが現在持っているのはモノリシックアプリケーションであり、マイクロサービスに移行しようとしています。また、現在のインフラストラクチャ(STM/Weblogicクラスタ/ Authツールなど)から移動することもできません。私たちが計画したのは:

  1. リクエストを他のマイクロサービスにルーティングするゲートウェイWAR
  2. 各機能サブドメインのN xマイクロサービス(WAR)
  3. API Gatewayのみがユーザーリクエストを受信し、他のマイクロサービスには外部からアクセスできません

だから私の質問は

  1. 他のマイクロサービスがステートレスである間、API Gatewayはステートフルである必要がありますか?
  2. もしそうなら、ユーザーセッションデータはどのようにAPI Gatewayとマイクロサービスの間で共有されるべきですか?

より良い代替案やリソース/リンクも提案してください。ありがとう。

18
Fahim Farook

私の意見を共有させてください。

まず、アプリケーションをステートレスに保つことができる場合は、必ずそうしてください:)パフォーマンスとスケーラビリティの両方の観点から、これは最良のソリューションです。

さて、それが不可能な場合は、分散セッション管理レイヤーを維持する必要があります。

認証を担当するゲートウェイは、後でキーとして使用できるいくつかの一意のセッション識別子を生成できます。このキーは、すべてのマイクロサービスに伝播され、APIまたは何かの一部になる可能性があります。

セッションにアクセスするために、マイクロサービスはキーによって値を「取得」し、それを操作できます。

実装に関しては、NoSQLソリューションについて見ていきます。あなたのニーズに合うことができるそれらのいくつかは:

  1. Redis 。そこで「hset」を見てください
  2. ヘーゼルキャスト 。よりインメモリグリッドですが、ソリューションがJava=のみの場合、必要な機能を実装することもできます。
  3. Memcache.d 。それはあなたに古くて良い地図を与えるでしょう、ちょうど配布されました:)

私が信じている他の解決策もあります。

さて、ここではパフォーマンスが非常に重要です。さもなければ、ソリューション全体が非常に遅くなります。したがって、私の理解では、RDBMSを使用することはここでは適切ではありません。さらに、潜在的に、RDBMSをスケールアウトすることが困難になる可能性があります。

お役に立てれば

26
Mark Bramnik

1)他のマイクロサービスがステートレスである間にAPI Gatewayをステートフルにする必要がありますか?

はい、のように 12 Factor Appのガイドライン すべてのサービスはステートレスである必要があります。

2)その場合、APIセッションとマイクロサービスの間でユーザーセッションデータをどのように共有する必要がありますか?

APIはステートレスである必要があるため、セッション状態をマイクロサービスと共有しないでください。推奨されるアプローチは、セッションデータを格納するようにRedisキャッシュを設定することです。

enter image description here

2
indika