2017-01-28 4 views
0

時間/日/何時でもユーザーを25k /リクエストに制限したいと考えています。Webベースのアプリケーションでリクエストを制限するためのクォータシステムの実装

私の最初のアイデアは、単にmysqlを使用して、ユーザーのテーブルにリクエストを保存する列があり、ユーザーがリクエストするたびにこのカウンタを増やすというものでした。このアプローチの問題は、時には列に同時に書いてしまうことがあり、mysqlからデッドロックが発生することです。これは実際には良いことではありませんか?

別の方法として、列のカウンタをインクリメントする代わりに、別のテーブルにログレコードを挿入して、指定したタイムパンでこれらのレコードを数えることができます。クエリが遅すぎる可能性があります。

RDBMSを使用する場合は、各リクエスト時にデータベースからユーザークォータを数えなければならないという点を考慮する必要があります。これは、前述のいずれの方法でも時間がかかることがあります。

私の2番目のアイデアは、redis/memcached(どちらか選択肢が不明であるか、どちらが速いのかわからない)を使用してリクエストカウンタをそこに格納すると考えました。これは、RDBMSよりも確かに高速ですが、カウンターを照会およびインクリメントするのに十分速いでしょうが、膨大な量のデータを試していないので、まだそれがどのように実行されるかわかりません。

私は第3の考え方で、マップ内のメモリにクォータデータを保存します。map[int]intのようなものです。ここでキーはuser_idで、値はクォータの使用量になり、マップアクセスをミューテックスで保護します。これはすべての中で最も速い解決策ですが、何らかの理由でアプリがクラッシュした場合、特定のユーザーのリクエスト数に関連するすべてのデータが失われた場合はどうしますか? 1つの方法は、クラッシュ時にアプリをキャッチし、地図をループしてデータベースを更新することです。これは実現可能ですか?

上記のいずれかが適切なアプローチであるかどうかはわかりませんが、私は提案を受けています。

+0

あなたはウェブアプリケーションについて話しているので、簡単で非常に軽量な解決策は、多数のカウンタを保持するメモリ構造を最適化したHAProxyでこれを行うことです。レート制限](http://blog.serverfault.com/2010/08/26/1016491873/)。 –

答えて

1

同時に行を更新しようとすると、「get a deadlock from mysql」という意味がわかりません。しかし、単純なupdate rate_limit set count = count + 1 where user_id = ?あなたが望むことを行う必要があります。

私は個人的にはレート制限を行うためにレディスで大きな成功を収めています。あなたのユースケースに対する適切なアプローチを理解するのに役立つ多くのリソースがあります。ここで私はちょうどそれを正しく扱うように見える1つです:https://www.binpress.com/tutorial/introduction-to-rate-limiting-with-redis/155。パイプライン(MULTI)またはLuaスクリプトを使用すると、さらにうまくいくかもしれません。

+0

返信いただきありがとうございます。私はatmで正確なエラーコードを持っていませんが、並列リクエストを行うと問題が発生し、2つ以上のリクエストが同時にそのカラムを更新しようとします。失敗するでしょう。私は、原子の更新を行う方法が必要だと思うが、何も発見されていない。 redisリンクをありがとう、私はそれを見てみましょう。 – Twisted1919

+0

@ Twisted1919これはデッドロックとは異なります。原子的な更新は問題なく、ロック競合は透過的に処理されます。デッドロックは、2つのトランザクションがそれぞれすでに保持しているロックを取得しようとするときに発生します.1つの行の1つの列の単純なアトミック更新では起こりません。 –

0

map[int]intはRDBMSに保存することも、ファイルシステムの時刻と遅延機能で保存することもできます。あなたはredisの代わりにそれをキャッシュとして使うことさえできます。確かに、リクエストごとにサードパーティサービスへの接続よりも速いでしょう。また、ユーザー側のカウンターを単にクッキーに保存することもできます。スマートなユーザーは、クッキーをクリアすることができますが、それはまったく危険なので、クッキーにいくつかの識別情報を提供して、不快なものを取り除くこともできます。

関連する問題