時間/日/何時でもユーザーを25k /リクエストに制限したいと考えています。Webベースのアプリケーションでリクエストを制限するためのクォータシステムの実装
私の最初のアイデアは、単にmysqlを使用して、ユーザーのテーブルにリクエストを保存する列があり、ユーザーがリクエストするたびにこのカウンタを増やすというものでした。このアプローチの問題は、時には列に同時に書いてしまうことがあり、mysqlからデッドロックが発生することです。これは実際には良いことではありませんか?
別の方法として、列のカウンタをインクリメントする代わりに、別のテーブルにログレコードを挿入して、指定したタイムパンでこれらのレコードを数えることができます。クエリが遅すぎる可能性があります。
RDBMSを使用する場合は、各リクエスト時にデータベースからユーザークォータを数えなければならないという点を考慮する必要があります。これは、前述のいずれの方法でも時間がかかることがあります。
私の2番目のアイデアは、redis/memcached(どちらか選択肢が不明であるか、どちらが速いのかわからない)を使用してリクエストカウンタをそこに格納すると考えました。これは、RDBMSよりも確かに高速ですが、カウンターを照会およびインクリメントするのに十分速いでしょうが、膨大な量のデータを試していないので、まだそれがどのように実行されるかわかりません。
私は第3の考え方で、マップ内のメモリにクォータデータを保存します。map[int]int
のようなものです。ここでキーはuser_idで、値はクォータの使用量になり、マップアクセスをミューテックスで保護します。これはすべての中で最も速い解決策ですが、何らかの理由でアプリがクラッシュした場合、特定のユーザーのリクエスト数に関連するすべてのデータが失われた場合はどうしますか? 1つの方法は、クラッシュ時にアプリをキャッチし、地図をループしてデータベースを更新することです。これは実現可能ですか?
上記のいずれかが適切なアプローチであるかどうかはわかりませんが、私は提案を受けています。
あなたはウェブアプリケーションについて話しているので、簡単で非常に軽量な解決策は、多数のカウンタを保持するメモリ構造を最適化したHAProxyでこれを行うことです。レート制限](http://blog.serverfault.com/2010/08/26/1016491873/)。 –