2012-04-16 6 views
12

私はSpring 3 + Spring MVCを使って簡単なREST APIを開発しています。認証は、Spring Securityを使用してクライアントトークンを使用してOAuth 2.0または基本認証を通じて行われます。これはまだ議論の対象です。すべての接続はSSL接続によって強制されます。Springのクライアントトークンに基づいてレート制限を実装する方法は?

私はレート制限を実装する方法に関する情報を探していましたが、そこには多くの情報があるようには見えません。実装は複数のWebサーバーで機能するという点で分散される必要があります。

例:3つのAPIサーバA、B、Cがあり、クライアントが5つの要求に1秒に制限されている場合、6つの要求を行うクライアントは、Cの要求をエラーで検出します。

A recieves 3 requests \ 
B receives 2 requests | Executed in order, all requests from one client. 
C receives 1 request /

これは、1つのクライアントが多くのユーザーに代わってリクエストを作成することができる、そして各ユーザーではなく、サーバーのIPアドレスより限定された率でなければなりませんよう、要求に含まれたトークンに基づいて作業する必要があります。

設定は、HAProxyロードバランサの背後にある複数(2-5)のWebサーバになります。カサンドラが裏打ちされていて、memcachedが使用されています。 WebサーバーはJetty上で動作します。

解決策の1つは、トークンを抽出し、最後のX秒間にトークンを生成した回数をチェックするカスタムSpring Securityフィルタを作成することです。これにより、異なるクライアントに対して異なるレート制限のようないくつかのことを行うことができます。

どうすればいいですか?既存のソリューションがありますか、私自身のソリューションを作成する必要がありますか?以前は多くのWebサイトのインフラストラクチャをやっていませんでした。

+0

あなたは正しいアイデアをフィルターのアイデアで持っています。すでにmemcachedを使用しているので簡単です。 – sourcedelica

+0

フィルタのように見えるのは、行く方法かもしれません。最後のX分/秒間にapiの使用をチェックできるようにバケットシステムを実装するための有用な記事を見つけました - > http://chris6f.com/rate-limiting-with-redisそれはredisを使用しますが、原則はmemcacheまたはcassandraに似ている必要があります。 –

答えて

0

可能であれば、この要件を満たすためにアプリケーションレベルのコードを変更しないでください。

私はHAProxy LB文書を見てきましたが、それでも明確なことはありませんでしたが、ACLの完全な調査が必要な場合があります。

HAProxyを片面に置くと、Apache WebServerを前面に置き、Apacheプラグインを使用してレート制限を行うことが考えられます。制限を超えるリクエストは前から拒否され、Apacheの背後にある層のアプリケーションサーバーはレート制限の問題から分離され、アプリケーションサーバーがよりシンプルになります。 Webサーバーから静的コンテンツを提供することも考えられます。

この質問 How can I implement rate limiting with Apache? (requests per second)

私はこれが役に立てば幸いに対する回答を参照してください。 ロブ

+1

答えをありがとう。このプロジェクトでは現在Apache WebServerは使用されていませんが、Jettyはwarファイルの展開に使用されます。現在のアプリを構成する多くの既存の戦争があり、APIは単にJettyで実行される別のWebアプリです。可能であれば、Apacheに切り替えるのはかなりの労力を要するので、避けようとしています。 Apache modはトークン制限ではなくIPに焦点を当てているようです。アプリケーションコードでそれを行うのは苦痛ですが、ほとんどのコントロールを提供するようです。遅いかもしれませんが、DDoS攻撃を止めるためのものではありません。 –

0

フローのさまざまな時点でレート制限を設定することができます(一般的には高いほうが高くなります)。一般的なアプローチは大変意味があります。実装の1つのオプションは、それを行うために3scale(http://www.3scale.net)を使用することです - レート制限、分析、キー管理などを行い、コードプラグイン(Javaプラグインはここにあります:https://github.com/3scale/3scale_ws_api_for_java) Varnish(http://www.varnish-cache.org)をパイプラインで使用し、レート制限を適用すること。

0

私はまた数日前に同様のソリューションを考えていました。基本的には、分散環境におけるクライアント要求の状態を保存するための「中央制御型」ソリューションが好まれます。

私のアプリケーションでは、「session_id」を使用してリクエストクライアントを識別します。次に、サーブレットフィルタまたはSpring HandlerInterceptorAdapterを作成してリクエストをフィルタし、memcached、redis、cassandra、またはzookeeperのような中央制御データリポジトリで「session_id」をチェックします。

関連する問題