17

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 サイトのインフラストラクチャを作成したことがありません。

4

6 に答える 6

1

1 つのクライアントが多くのユーザーに代わってリクエストを行う可能性があり、サーバーの IP アドレスではなく各ユーザーのレートを制限する必要があるため、リクエストに含まれるトークンに基づいて機能する必要があります。

セットアップは、HAProxy ロード バランサーの背後にある複数 (2 ~ 5) の Web サーバーになります。Cassandra がサポートされており、memcached が使用されています。Web サーバーは Jetty で実行されます。

プロジェクトはリクエスト/レスポンス http(s) プロトコルだと思います。そして、HAProxy をフロントとして使用します。HAProxy は で負荷分散できるかもしれません。ここtokenから確認できます。

次に、同じtokenリクエストが同じWebサーバーに到達し、Webサーバーはメモリキャッシュを使用してレートリミッターを実装できます。

于 2019-04-01T02:40:37.497 に答える
0

フローのさまざまなポイントにレート制限を設定することができ(通常は高いほど良い)、一般的なアプローチは非常に理にかなっています。実装の1つのオプションは、3scaleを使用して実行することです(http://www.3scale.net)-レート制限、分析、キー管理などを実行し、コードプラグイン(Javaプラグインはここにあります:https ://github.com/3scale/3scale_ws_api_for_java)をプッシュするか、Varnish(http://www.varnish-cache.org)のようなものをパイプラインに配置し、レート制限を適用します。

于 2012-06-06T11:00:33.967 に答える
0

可能な限り、この要件を満たすようにアプリケーションレベルのコードを変更することは避けます。

HAProxy LBのドキュメントを調べたところ、あまり明白ではありませんでしたが、要件によってACLの完全な調査が必要になる場合があります。

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

この質問への回答を参照してください。Apacheでレート制限を実装するにはどうすればよいですか。(1秒あたりのリクエスト数)

これがお役に立てば幸いです。ロブ

于 2012-04-17T00:56:41.540 に答える
-1

REDIS を使用してratelimitを実装するのが最善です。詳細については、このレート制限 js の例を参照してください。

于 2013-12-31T11:59:10.007 に答える