質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.19%

サーバーのアクセス数/リクエスト数制限の実現方法について教えて下さい。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 8,835

QazOkm

score 12

1秒間にリクエスト出来る数を制限する方法を教えて下さい。

現在、AWSでEC2を2台構成でロードバランサーを使用しています。
アプリからAPIを通してこのAWSにアクセスしてきた際に、外部の別のDBサーバーにアクセスをし、
そこからデータを取得してアプリにデータを返す処理を行っています。
今回困っているのが、外部のDBサーバーの管理者から、「うちのサーバーには1秒間に5リクエストまでしか来ないように制限してくれないと、アクセス制限をかける」と言われてしまいました。
アプリからうちのサーバーにアクセスがきた時に制限をかけるのか、それとも外部DBサーバーにアクセスする際に制限をかけるのか、
どのように実現するのかが経験が無くわからないため、どなたか教えていただけないでしょうか?
因みに、サーバーはCentOS6.5で、外部DBサーバーへはAWS DirectConnectを使用しています。

何卒、よろしくお願い致します。

【追記】
CHERRY様
ご指摘頂きありがとうございます。
詳細な情報を記載させていただきます。

現在のアクセス数:1日あたり 大体10,00015,000アクセスになります。
ユーザーがサーバー負荷でアクセスできない状況は避けたいです。
可能であれば制限を超えてきたアクセスに関しては待ち?の状態にして、順次レスポンスを返すように出来ればと考えています。

APIの内容に関してですが、
外部のDBサーバーに本の情報が格納されており、新刊情報や検索APIが叩かれた時にその外部DBサーバーへアクセスして
情報を取得し、うちのサーバーで整形してアプリ側へデータを返す流れになります。
その他にユーザー登録のAPIもあります。

また、うちのAWSサーバーには管理画面も稼働させており、
APIの方だけアクセス数を制限できればと考えております。

よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2016/09/09 18:37

    アクセス数やデータの内容、ユーザーがアクセスが多いため利用できないことがあってもいいのか? など不明点が多く、アプリやAPIの概要を知らない人が回答できる内容ではないと思います。
    もう少し具体的な情報を提供できないでしょうか?

    キャンセル

回答 2

checkベストアンサー

+1

以下の条件であれば、iptables の hashlimit で制限できるかもしれません。

・EC2インスタンスが Linux 
・EC2インスタンスから DB へのリクエストは 1リクエスト/1接続で、毎回 TCP ハンドシェイクを行なう(keep-alive ではない) 
・DB に接続できない場合の処理をアプリケーション側で適切に行なっている。

iptables -A OUTPUT -p tcp --syn -d (DBサーバーIP) --dport (DBサーバーport) \
    -m hashlimit --hashlimit-name db_outbound_limit \
    --hashlimit-mode dstip,dstport --hashlimit-upto 2/sec -j ACCEPT
iptables -A OUTPUT -p tcp --syn -d (DBサーバーIP) --dport (DBサーバーport) -j DROP


2つの EC2インスタンスから外部 DBサーバーへの接続を、それぞれ 2回/1秒 に制限します(2サーバーで 4回/1秒)。

2回/1秒 を越えた接続は TCP接続待ちになります。
この待ちの際のアプリケーション側の挙動がどうなるかはアプリケーション次第なので、どうなるかわかりません。
接続待ちが多くなってタイムアウト時間を過ぎてエラーとなるか、逆にタイムアウト時間が長く、接続待ちでネットワークソケットを使い切ってしまうかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/12 23:28

    詳細な情報をありがとうございます!
    タイムアウト等の問題が発生する可能性があるのですね、、
    参考にさせていただきます。

    キャンセル

0

通信経路や回線速度の問題があるので、「単位時間あたり○○アクセス」を直接設定するのは難しいと思います。
アプリケーションサーバやDBサーバが何をお使いか書かれていませんが、同時セッション数を制限するパラメータは存在すると思います。
それと現在の単位時間あたりのアクセス件数の統計情報を突合しつつチューニングする、というやり方になるのではないでしょうか。

ただ、アクセス制限をかけるとしたらアプリ側からだと思います。
アプリ側であれば、アクセス数があふれた際に「混みあっております」などと何かレスポンスを返す仕組みが取れると思いますが、DB側にのみアクセス制限をかけると、アクセスが集中したときのユーザビリティが悪くなることが考えられます。
(アプリが反応していないように見えるとか、応答が極端に遅く見えるとか)

一つ疑問なのが以下のくだりで、

>「うちのサーバーには1秒間に5リクエストまでしか来ないように制限してくれないと、アクセス制限をかける」と言われてしまいました。

このサーバ管理者は本当に困っているのでしょうか?それともそこまで強い言い方ではないのでしょうか。
というのも、15,000アクセス/日だと単純計算すると0.17アクセス/秒程度にしかならないなぁ、と思ったからです。
(単純平均というのが乱暴なのは分かっていますが)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/12 23:30

    詳細な情報をありがとうございます!
    やはりユーザビリティが悪くなる問題があるのですね、、

    >このサーバ管理者は本当に困っているのでしょうか?それともそこまで強い言い方ではないのでしょうか。
    出来れば的な感じはあったので、ちょっと相談をしてみたいと思います。
    ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る