14

JVM間でメソッドを同期するにはどうすればよいですか?

私の例は、ユーザー名が複数回ログインすることを制限する Web アプリケーションです (つまり、最初のユーザーはログオンできますが、別のユーザーが同じユーザー名でサインオンすると、そのユーザーは拒否されます)。

Web アプリケーションは複数のサーバーにデプロイされるため、複数の JVM が存在し、ユーザーはロード バランサーに応じて異なるサーバーを使用してサインオンを試みることができます。

メソッドの外観は次のとおりです

public synchronized static SessionData logonSync(String userName, String password) throws Exception 
{
    int count = DB.count("sessions", "WHERE user_name=?", userName);
    if (count > 0)
    {
       throw new Exception("logon.error.loginAlreadyUsed");
    }                   

    return logon(userName, password);
}

同期方式のため、1 つのアプリ サーバーで正しく動作しますが、複数の JVM 間で動作しますか? 2 人のユーザーが同時に異なる Web アプリにログインしようとしている可能性があります。どうすればこれを防ぐことができますか?

* 編集 * ソリューションでトランザクション キャッシュ メソッドを利用したい場合、アプリは Memcached も使用します。

4

1 に答える 1

16

JVM 間でのメソッドの同期について質問されました。これには、分散プロセスを処理するライブラリが必要です。多くのオプションがありますが、ここではほんの一部を示します。

  1. Terracotta - 特定のフィールドを JVM 間で「共有」するように設定することをサポートしているため, synchronized キーワードのような標準の JVM ロックを使用でき, 複数の JVM で動作します.
  2. JGroups - Jgroups は分散アプリケーション用のツールキットです. ロックは、それが提供する機能の 1 つです。ドキュメントの例を次に示します

使用するライブラリに関係なく、分散ロックの設定は決して簡単ではありません。必要な場合は問題ありませんが、あなたの例では、これはやり過ぎのようです。その他のオプション:

  • データベースに一意性制約を追加して、一意性を強制します。これはデータベースのパフォーマンスに影響を与える可能性があるため、予想されるトラフィック量に大きく依存します。
  • ロード バランサーに、ユーザー名 (またはそのハッシュ) を、要求を Web サーバーに割り当てるために使用するキーとして使用させます。これにより、同じユーザー名からのリクエストが毎回同じ Web サーバーに到達することが保証されます。分散ロックは必要なく、通常のロックを使用するだけです。
于 2013-10-15T21:16:24.630 に答える