2016-12-16 10 views
1

私のサービスのREST-API使用の乱用を最適化して削減したいと考えています。Spring Webサービスの同時呼び出しの制限

したがって、java spring上のwebserivceへの同時呼び出しの量を制限する方法はありますか?例えば

私は

@RequestMapping(value="demo",method=RequestMethod.GET) 
    public synchronized @ResponseBody ObjectNode getDemo() 
    { 
     logger.info("started.. demo "); 
     ObjectNode node = om.createObjectNode().put("test", true); 
     logger.info("end.. demo"); 
     return node; 
    } 

以下、この方法を持っている場合、私は、一度に1ユーザーにこのサービスを制限することになります。しかし、4人または10人の同時ユーザーに制限するのはどうでしょうか?

感謝:)

答えて

1

アウトオブボックスrate limiting supportは、今のところ、春のためにありません。

ただし、Google Guavaをご利用の場合はRateLimiterという形式のサポートがあり、詳しい説明はhereです。

Google Gauvaがオプションでない場合は、Token Bucketアルゴリズムを使用してレートリミッタを実装することを検討してください。

サンプルの実装は、部品の下有していなければならない -

  • 要求を傍受するためにトークン(好ましいインメモリキャッシュ
  • サーブレットフィルタを保持するバケット好ましい構成に制限されるURLのみ、/*パターンを避けるURL)
  • 定期

バケツを補充する予定のサービスはバケツ - 最も単純な形式でバケットがトークンとして利用できる(S)としてURLおよび値としてキー名を持つキャッシュエントリとして作成することができます

キー以下の実施例に示さ= '/テスト/デモ' 値= 5
キー= '/試験/ otherDemo' 値= 10

好ましく

フィルター任意の同時アクセスの問題を回避するために、トークン数を保持するためにAtomicIntegerを使用する - ここでは単純に(すなわちキャッシュを読んで、トークンの正の値を探しバケットからトークンを取得してみてください。ゼロまでトークン値を1ずつ減らす)。 は、トークンがHTTP status code 429

スケジューラとelseブロックの要求を取得した唯一の要求を続行 - ベースのcronスケジュールされたサービス(@Scheduled参照)、単位時間当たりの最大許容リクエストでキャッシュをリセットします。

詳細情報が必要な場合は、コメントでお知らせください。

+0

しかし、良いアプローチでは、一定の量の同時呼び出しを使用するようにサービスを制限しようとしていました(4としましょう)。これは、このサービスの呼び出しにどれくらいの時間がかかるかわからないからです。より多くの同時呼び出しほどサービスが遅くなります。 – dsncode

+0

この場合、スケジューラが毎回の実行でバケットを固定番号に補充するので、この方法を使用することはできます(* 4)。追加として、許可されたコールの最大数を設定可能に保つことができます(*プロパティファイル/データベース*) –

関連する問題