3

私はかなり長い間Webアプリケーションを扱ってきました。ただし、複数のインスタンスとしてホストされ、負荷分散されているWebアプリケーションに取り組んだことはありません。

私の質問:Webアプリケーションは、同じアプリケーションの複数のインスタンスにわたる書き込みをどのように管理しますか?

例:チケット予約サイト。映画の特定の列の座席をブロックして、リクエストを送信するとします。同時に、別のユーザー(アプリケーションがクラスター化され、負荷分散されているために他のインスタンスによってサービスが提供されます)も、選択したシートの1つをブロックしましたが、Webアプリケーションはこのシナリオをどのように管理しますか?なぜなら、それらは異なるマシンで実行されている異なるプロセスであり、どこでロックが発生するのでしょうか?キャッシュの一貫性をどのように維持しますか?すぐに利用できるソリューションはありますか?

4

2 に答える 2

7

それでも、単一ノードアプリケーションでの同時書き込みでも同じ問題が発生します。これは、1つのJVMであるため、管理が簡単です。

なぜなら、それらは異なるマシンで実行されている異なるプロセスであり、どこでロックが発生するのでしょうか?

すべてのインスタンスで共有される単一のポイントであるデータベースは、最も簡単な目標です。予想される負荷とユースケースに応じて、楽観的ロックは非常に簡単に実現できます(JPAの例)。データベーストランザクションと組み合わせると、パフォーマンスを取引することなく、一定レベルの原子性を実現できます。

キャッシュの一貫性をどのように維持しますか?すぐに利用できるソリューションはありますか?

特に分散環境では、キャッシングは困難です。たとえば、はインスタンス間で通信でき、1つのインスタンスでキャッシュが変更されると、このイベントを他のノードにブロードキャストします。など、他にもたくさんの製品があります。

于 2012-10-28T13:35:41.613 に答える
1

私は数年間、チケット予約のバックエンドに取り組んでいました。通常、このシナリオでは、Webアプリ全体がデータベースに支えられており、座席には、利用可能、ブロック、予約などのさまざまな状態があります。

仕組みは次のとおりです。

  • ユーザーAとBがWebアプリにアクセスし、両方ともシートSが使用可能であることを確認します。
  • ユーザーAが座席Sを選択します。データベースで、Sの状態がからavailableに変わります。booked
  • ユーザーBはシートSを選択しようとします。バックエンドはシートSがblockedであると応答し、ユーザーBにはエラーメッセージが表示されます。

たとえばAjaxを使用して、シートステータス「ライブ」を更新することで、アプリをよりユーザーフレンドリーにすることができます。

于 2012-10-28T13:35:51.793 に答える