クラウド同上

【問題】GAEの自動スケーリングインスタンスにHTTPリクエストしたとき、何秒でタイムアウトするでしょうか?

Author
qushot
Lv:16 Exp:66202

映画好きエンジニア。
GAEとかGKEやってます!Goが好きです!

60秒?

いえいえ、600秒になりました! ただしJava 8、PHP 5、Python 2 テメーらは60秒のままだ
「昔は30秒だった」とか言い出す人は歴戦の猛者感があって怖いです、やめてください><;;;

以前から「GAEのHTTPリクエスト、60秒超えても処理続いてない?」や「5分くらいまでならタイムアウトしなくない?」といった話はちらほら見かけたような気がします。
が、2020年2月ごろに社内の一部で「ドキュメントに10分って明記されてる!」と話題になりました。


公式ドキュメント

これについて触れられている記事が世に無いように思えたので、10分間タイムアウトしないことを軽く検証して残しておきます。

検証

今回は以下の2点を検証していきます。

  1. 本当に10分間タイムアウトしないか
  2. 何分までタイムアウトせずに処理を続けられるか

今回は検証のために、公式のHelloWorldサンプルのコードを流用し、クエリパラメータからSleepする秒数を渡してスリープさせるコードを実装し、GAE/Go 1.12環境へデプロイしました。

main.go
package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
	"strconv"
	"time"
)

func main() {
	http.HandleFunc("/", indexHandler)

	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
		log.Printf("Defaulting to port %s", port)
	}

	log.Printf("Listening on port %s", port)
	if err := http.ListenAndServe(":"+port, nil); err != nil {
		log.Fatal(err)
	}
}

// indexHandler responds to requests with our greeting.
func indexHandler(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path != "/" {
		http.NotFound(w, r)
		return
	}
	// ここから
	s := r.URL.Query().Get("s")
	sec, err := strconv.Atoi(s)
	if err != nil {
		http.Error(w, "400 bad request", http.StatusBadRequest)
		return
	}

	time.Sleep(time.Duration(sec) * time.Second)
	// ここまで追加
	fmt.Fprint(w, "Hello, World!")
}
app.yaml
runtime: go112
デプロイ方法
$ gcloud app deploy

結果

  1. 本当に10分間タイムアウトしないか

    600秒ではタイムアウトせずにレスポンスを返してきてくれました!

  2. 何分までタイムアウトせずに処理を続けられるか

    まずは試しにと思い、601秒で試したところ、早速タイムアウトしてしまいました。きっちりしています。

まとめ

  1. GAEの60秒制限は10分制限になっていた
  2. 10分を1秒でも過ぎるとエラーになる

弊社クラウドエース株式会社は Google Cloud のプレミアパートナーとして、Google Cloud Platform 利用にあたってのカスタマーサービスや技術サポート・構築・開発・トレーニングなど Google Cloud に関するサービスを幅広く提供しております。ご相談ございましたらお気軽にお問い合わせください!