Spring 3 + Spring MVC を使用して単純な REST API を開発しています。認証は、OAuth 2.0 または Spring Security を使用したクライアント トークンによる基本認証によって行われます。これはまだ議論中です。すべての接続は、SSL 接続を介して強制されます。
レート制限を実装する方法に関する情報を探していましたが、そこには多くの情報があるようには見えません。実装は、複数の Web サーバーで機能するため、分散する必要があります。
たとえば、3 つの API サーバー A、B、C があり、クライアントが 1 秒間に 5 つのリクエストに制限されている場合、そのように 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 サーバーになります。Cassandra がサポートされており、memcached が使用されています。Web サーバーは Jetty で実行されます。
考えられる解決策の 1 つは、トークンを抽出し、過去 X 秒間にトークンを使用して行われたリクエストの数をチェックするカスタム Spring Security フィルターを作成することです。これにより、クライアントごとに異なるレート制限などを行うことができます。
それを行う方法について何か提案はありますか?既存のソリューションはありますか、それとも独自のソリューションを作成する必要がありますか? 私は以前に多くの Web サイトのインフラストラクチャを作成したことがありません。