4

同じユーザーからの複数のリクエストを並行して処理しない従来のシステムのため、同時呼び出しの量を制限する必要があります。目標は、サービスへの同時リクエスト数を 1 pr に制限することです。user (session) - ただし、すべてのユーザーをブロックしないようにします。クライアント側ですべての ajaxrequests をキューに入れることができましたが、それは特定の呼び出しにのみ適用される問題に対する大ハンマーの解決策のように思えます。できればサーバー側で解決したい。

代替。1: 考えられる問題は、autowired サービスが spring によって注入された (requestscope による) プロキシであり、注入されたプロキシ参照が要求間で変更される可能性があることでしょうか? それとも、Spring は同じプロキシを再利用しますか? その場合、それは機能しますか?

@Scope("session")
public class Model {
    @Autowired
    Service service;

    public List<Pojo> getPojos() {
        synchronized(service) {
            if(!hasTriedToRetrievePojos) {
                hasTriedToRetrievePojos = true;
                service.getPojos();
            }
        }
    }
}


@Scope("request")
// Actually a LegacyService, wrapping an old legacysystem
public class Service {
    ...
}

代替。2: Spring がこのモデル pr のインスタンスを 1 つだけ構築する場合。これは意図したとおりに機能するはずです。

@Scope("session")
public class Model {
    private Object lock = new Object();

    @Autowired
    Service service;

    public List<Pojo> getPojos() {
        synchronized(lock) {
            if(!hasTriedToRetrievePojos) {
                hasTriedToRetrievePojos = true;
                service.getPojos();
            }
        }
    }
}

代替。3: モデルに HttpSession を挿入し、手動で HttpSessionプロパティを同期します ( Is HttpSession thread safe, are set/get Attribute thread safe operations?の最も支持された回答によると)。春の混乱はありませんが、より面倒です。

スティッキー セッションを使用している場合、セッション パラメーターの同期は、クラスター化された環境でも安全であると認識していますか?

4

1 に答える 1

0

私はあなたの2番目の解決策を支持しますが、同期する前にチェックを行い(高価です)、同期ブロックで別のチェックを行います。

public List<Pojo> getPojos() {
     if (!hasTriedToRetrievePojos) {
         synchronized(lock) {
             if (!hasTriedToRetrievePojos) {
                 hasTriedToRetrievePojos = true;
                 service.getPojos();
             }
         }
     }
}

サービス インスタンスは、インスタンス レベルでユーザー/セッション関連の状態が含まれていない限り、シングルトンである必要があります。

このソリューションには、同期がカプセル化されているだけで、 (最初のソリューションのModelように) の正しい構成に依存しないという利点があります。たとえば、サービスでは異なる動作が発生します)。それに加えて、最初の解決策も機能するはずです。代わりにを使用できます。Service@Scope("singleton")@Scope("request")@Scope("session")

スティッキー セッションとは、ユーザーのセッションが 1 つのアプリケーション サーバー インスタンスにバインドされ、このユーザーの各要求がこのインスタンスに送信されることを意味する場合、私はイエスと答えます。それは安全です。

于 2013-02-15T14:44:48.367 に答える