私は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サイトのインフラストラクチャをやっていませんでした。
あなたは正しいアイデアをフィルターのアイデアで持っています。すでにmemcachedを使用しているので簡単です。 – sourcedelica
フィルタのように見えるのは、行く方法かもしれません。最後のX分/秒間にapiの使用をチェックできるようにバケットシステムを実装するための有用な記事を見つけました - > http://chris6f.com/rate-limiting-with-redisそれはredisを使用しますが、原則はmemcacheまたはcassandraに似ている必要があります。 –