質問: Grapeを用いて、railsでAPIの開発をしております。 APIは多くのユーザーからアクセスがくるため、3分以内に◯回以上のリクエストを投げるとエラーを返す、といった機能を実装したいです。 ※もしくは、◯回というのをなくし、1分に1回で制限する等。 しかし、そういうのを実装するためにはどうすればいいのかがわかりません。 仮にBooksというAPIを開発している場合、 Bookモデルに * last_requested_at * request_count といったカラムを持ち、そのデータと照合して判断するというのは考えましたが、 今回の仕様上、Books以外にもたくさんのAPIがあります。 そのため、API毎にこれらのカラムを作らなければならず、 そういうのを避けて、実装することはできないかと考えております。 しかし、そういう方法を調べていても思う結果が見つからなかったため質問させて頂きました。 そもそも、不可能なのかもしれませんが、良いアイディアがあればご教授頂けますと幸いです。 よろしくお願いします。
回答: サーバ側でやるべきこと処理だと思います。なぜならDBを1リクエスト単位で介してしまうからです。ただしアプリケーション自体でも何とかなりますね。(小規模であれば別にこれでもよい) カラムをAPIごとに作りたいという話でしたが、別にモデル1つとテーブル1つでも実現できる内容だと思います。 要は ・APIの名前 ・リクエスト回数 ・アクセス時刻 ・IPアドレス(他に対象を特定できる情報があればそれでも良い。ユーザIDとか、私はIPをおすすめします) この4つの情報で一意に決まりますね。 処理系は以下のような実装が必要になります。 ・アクセス時刻が3分未満の場合、リクエスト回数を1増やします。 ・アクセス時刻が前回のアクセス時刻よりも3分以上の場合、リクエスト回数を0にします。 ・リクエスト回数が「上限以上」且つ、前回アクセス時刻が3分未満の場合、エラー表示用のhtmlをrenderしてください。 こんな回答でどうでしょうか。