Google Compute Engine&Nginx&Railsタイムアウト考察


diffeasy Advent Calendar 2019の3日目の記事です。

タイムアウト対策

Webでの大量データのPDF、CSVダウンロードなど、API実行すると処理が圧倒的に長くなるとタイムアウトになります。根本のロジックを見直す、非同期処理やバッチ処理を検討することが必達です。

ただ、根本対策に時間を要してしまう可能性があったため、暫定対策としてのインフラ側のタイムアウト値設定を伸ばすことをやってみたのでまとめます。

4分(240秒)ぐらいかかる処理だったため、余裕を持って5分(300秒)ほど処理できるようにしたものです。

(WebAPIとしてありえないとは突っ込まないでほしい。一旦。。)

前提となる環境

  • GoogleComputeEngine(Linux CentOS)
  • GCPロードバランサ
  • nginx
  • Rails(APIモード)
    • Puma
  • Vue.js(axiosでAPI実行)

処理順序は?

基本的に処理が進むにつれてタイムアウト値は短くする必要があります。
①API URL実行
②GCPロードバランサ
③GoogleComputeEngine(Linux CentOS)
④nginx
⑤puma(Rails)

タイムアウト値を持っているのは?

今回の構成では以下2つのみがデフォルト保有しているものでした。
この2つを変更することでタイムアウト値を変えることが出来ます。
②ロードバランサ
④nginx

変更方法

②ロードバランサ

  1. 負荷分散メニューの下部の青文字「詳細設定メニュー」を押下
  2. 「バックエンドサービス」タブを選択
  3. 編集ボタンを押下
  4. バックエンドサービス詳細の上部の方にある鉛筆マーク
  5. これで30秒→300秒に

④nginx

nginxのタイムアウト初期値は60秒。290秒に変更する。
fastcgi_read_timeout proxy_read_timeout をセットする。

    server {
        listen 10443;
        server_name xxxx.hogehoge.com;

        # タイムアウトまでの秒数を変更
        fastcgi_read_timeout 290;
        proxy_read_timeout   290;
    }

まとめ

4分ほどかかる処理を作ってしまうのが、そもそもアンチパターンですね。
ただ、その処理をリファクタリングするのに時間をかけてユーザーを待たせる可能性があるのなら、長い時間を待たせて動かしてもらうのも対策の1つになり得ると思います。