4

before_create人々がコメントを投稿しすぎていないかどうかをチェックするフィルターがあります。

もしそうなら、私は彼らのアカウントにフラグを立てたいです。

class Comment < ActiveRecord::Base
  before_create :check_rate_limit

  def check_rate_limit
    comments_in_last_minute = self.user.comments.count(:conditions => ["comments.created_at > ?", 1.minute.ago])
    if comments_in_last_minute > 2
      user.update_attribute :status, "suspended"
      return false
    end
    true
  end
end

before フィルターは false を返し、コメントの作成を停止します。問題は、これがユーザー モデルに加えた変更を元に戻す ROLLBACK をトリガーすることです。

これを達成するための正しいパターンは何ですか? 具体的には、オブジェクトが作成されるたびにチェックを実行し、チェックが失敗した場合に別のモデルを編集できるようにすることです。

4

3 に答える 3

2

レート制限への最善のアプローチは、リクエストをキューに入れ、最大許容レートで読み取ることだと思います。

過剰使用にフラグを立てるトリガーは、単にキュー内の要求の設定数になります。

また、より適切に制御可能なキューイングシステムでデータベースの前にボトルネックを移動できるため、データベースの背後にすぐに影響を与えないという利点もあります。これにより、「攻撃」下でもサイトの応答性を維持できます。

これらのキューは、リンクリストを使用したハッシュマップのように単純にすることができます。ただし、利用可能な場合は、スレッドセーフなFIFOを使用することをお勧めします

于 2010-06-06T08:30:57.017 に答える
0

これは理想的な答えではありませんが、今のところ、アカウントが停止された場合でも true を返すだけになりました。この方法でもう 1 つ通過しましたが、将来のものは通過しませんでした。

于 2010-07-15T19:23:43.900 に答える