REST API のレート制限ユーザー向けのベスト プラクティスは?
-
03-07-2019 - |
質問
REST API を作成していますが、その規模や需要がどの程度になるかが不明なため、使用量を制限したり、要求を一時的に拒否したりできるようにしたいと考えています。ボックスが容量を超えているか、何らかのスラッシュドットのシナリオがある場合。
また、容量を追加してサービスをスケールする必要がある場合に、(メイン サービスが少しオフラインであることを示す結果をクライアントに提供しながら)サービスを一時的に正常に停止できるようにしたいと考えています。
この種のことに対するベストプラクティスはありますか?実装はRailsとmysqlです。
解決
これはすべて、外部のWebサーバーで行われます。外部のWebサーバーは、世界をリッスンします(nginxまたはlighttpdをお勧めします)。
レート制限については、nginxは制限できます。つまり、各IPごとに50 req /分、503ページをカスタマイズできます。
予想される一時的なダウンに関して、Railsの世界ではこれは特別なmaintenanceance.htmlページを介して行われます。 Railsアプリサーバーがダウンしたときにファイルを作成またはシンボリックリンクする自動化があります。ファイルの存在ではなく、アプリサーバーの実際の可用性に依存することをお勧めします。
しかし実際には、接続をまったく失うことなくサービスを開始/停止することができます。つまり別のUNIXソケット/ IPポートでアプリサーバーの個別のインスタンスを実行し、その新しいインスタンスもバランサー(nginx / lighty / haproxy)で使用することができます。次に、古いインスタンスをシャットダウンすると、すべてのクライアントに新しいインスタンスのみが提供されます。接続は失われません。もちろん、このシナリオは常に可能とは限りません。新しいバージョンで導入した変更の種類によって異なります。
haproxyは、バランサーのみのソリューションです。ファーム内のアプリサーバーへのリクエストのバランスを非常に効率的に調整できます。
非常に大きなサービスの場合、次のような結果になります。
- ラウンドロビンNバランサーに解決するapi.domain
- 各バランサーは、静的コンテンツの場合はMウェブサーバーに、動的コンテンツの場合はPアプリサーバーにリクエストをプロキシします。ああ、あなたのREST APIには静的ファイルがありませんか?
非常に小さなサービス(2K rps未満)の場合、すべてのバランシングは1〜2台のWebサーバー内で行われます。
他のヒント
すでに良い答えがあります - リミッターを自分で実装したくない場合は、 3scale (http://www.3scale.net) レート制限、分析などを行います。APIの場合。プラグインを使用して動作します(詳細については、ここを参照してください) ルビーAPIプラグイン) 3scale アーキテクチャにフックします。また、ワニスを介して使用し、ワニスをレート制限プロキシとして機能させることもできます。
アプリケーションの外部にレート制限を実装することをお勧めします。そうしないと、トラフィックが多くてもアプリが強制終了される可能性があります。 1つの良い解決策は、 mod_evasive
のようなものを使用して、Apacheプロキシの一部として実装することです。