Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

JavaEEアプリケーションサーバに対するHTTPリクエストの流量制御が可能な箇所の候補

RHEL標準の機能のみで、外から追加のモジュール等を導入することなしに採用可能な方法の候補を列挙してみた。また商用JavaEEサーバの場合は専用の機能があるケースもありそうだが、Tomcatの場合に使える方法の候補も調べてみた。

制御箇所の候補

  • TCP/IPレベルで制御する
    • tcでQoSを指定する*1
    • firewalldのaccept limit valueを使う*2
    • nftablesのlimit rateを使う*3
  • APIゲートウェイで制御する
  • Webサーバで制御する
    • Apacheのmod_securityを使う*5
    • ServerLimitとMaxClientsを指定する
    • ProxyPassディレクティブのmaxパラメータを指定する*6
  • アプリケーションサーバで制御する
    • Tomcatの場合
      • maxThreads,maxConnectionsを指定する*7
      • SemaphoreValveを使う*8
    • その他商用JavaEEサーバ
      • JavaEEサーバの流量制御機能を使う*9
  • アプリケーション内で制御する
    • GuavaのRateLimiterを使う*10
    • bucket4jを使う*11
    • 自前で実装する*12
  • クライアント側に協力してもらう
    • レスポンスにrate limitの情報を含める*13

評価の必要な観点

  • CGNを考慮した流量制御が可能か(リクエスト送信元ポート番号が考慮可能か)
  • 同様に、RFC 6302を考慮してログが残せるか
  • URLパスごとの制御が可能か
  • 「最大○リクエスト」に加えて「N秒間に最大Mリクエスト」という制御が可能か
  • リクエスト数での制御が可能か
  • ネットワーク帯域での制御(最大○Mbpsまで許可)が可能か