リクエストの処理方法

このドキュメントでは、App Engine アプリケーションがリクエストを受信してレスポンスを送信する方法について説明します。詳細については、リクエスト ヘッダーとレスポンスのリファレンスをご覧ください。

アプリケーションでサービスが使用されている場合は、特定のサービスまたはそのサービスの特定のバージョンへのリクエストを指定できます。サービスのアドレス指定の方法について詳しくは、リクエストのルーティング方法をご覧ください。

リクエストの処理

アプリケーションは、ウェブサーバーの起動とリクエストの処理を行う役割を果たします。開発言語で使用できる任意のウェブ フレームワークを使用できます。

App Engine はアプリケーションの複数のインスタンスを実行します。各インスタンスには、リクエストを処理するウェブサーバーがそれぞれ割り当てられます。リクエストがルーティングされるインスタンスは任意に決まるため、同じユーザーから連続して送信されたリクエストが同じインスタンスに届くとは限りません。インスタンスは、複数のリクエストを同時に処理できます。インスタンスの数は、トラフィックの変化に応じて自動的に調整されます。また、app.yaml ファイルの max_concurrent_requests 要素を設定することで、インスタンスが同時に処理できるリクエストの数を変更できます。

App Engine 用の Go ランタイムでは、Go プログラムと App Engine サーバー間のインターフェースとして標準の http パッケージが使用されます。App Engine はアプリケーションへのウェブ リクエストを受け取ると、要求された URL に関連付けられた http.Handler を呼び出します。

次の例は、ハードコードされた HTML 文字列をユーザーに対して出力する完全な Go アプリを示しています。

package hello

import (
	"fmt"
	"net/http"
)

func init() {
	http.HandleFunc("/", hello)
}

func hello(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "<h1>Hello, world</h1>")
}

割り当てと制限

App Engine は、トラフィックが増加すると、自動的にアプリケーションにリソースを割り当てます。ただし、次のような制限があります。

  • App Engine は、1 秒未満でリクエストに応答するレイテンシが短いアプリケーションを対象に、自動スケーリングのための容量を予約しています。レイテンシが長く(リクエストの多くで 1 件あたり 1 秒を超えるようなレイテンシ)、スループットが大きいアプリケーションでは、シルバー、ゴールド、プラチナのいずれかのサポートが必要です。これらのレベルのサポートを契約済みの場合は、サポート担当者に連絡してスループットの上限の引き上げをリクエストできます。

  • また、CPU の制約を大きく受けるアプリケーションでも、同じサーバー上の他のアプリケーションとリソースを効率的に共有するために、追加のレイテンシが生じる場合があります。静的ファイルへのリクエストには、このようなレイテンシの制限がありません。

アプリケーションが受信する各リクエストは、[リクエスト数] の制限対象としてカウントされます。リクエストへのレスポンスとして送信されるデータは、[送信帯域幅(課金対象)] の制限対象としてカウントされます。

HTTP リクエストと HTTPS(セキュア)リクエストのどちらにも、リクエスト数受信帯域幅(課金対象)送信帯域幅(課金対象)の制限が適用されます。GCP Console の割り当ての詳細ページでも、参考のために安全なリクエスト数安全な受信帯域幅安全な送信帯域幅がそれぞれ報告されます。これらの値としてカウントされるのは、HTTPS リクエストのみです。詳細については、[割り当て] ページをご覧ください。

リクエスト ハンドラの使用には、具体的には次の制限が適用されます。

制限
リクエスト サイズ 32 MB
レスポンス サイズ 32 MB
リクエスト期間 60 秒
最大合計ファイル数(アプリファイルと静的ファイル) 合計 10,000 ファイル
1 ディレクトリあたり 1,000 ファイル
アプリケーション ファイルの最大サイズ 32 MB
静的ファイルの最大サイズ 32 MB
すべてのアプリケーション ファイルと静的ファイルの最大合計サイズ 最初の 1 GB は無料
最初の 1 GB を超えると、以降は 1 GB あたり毎月 0.026 ドル

レスポンスに関する制限事項

動的レスポンスの上限は 32 MB です。スクリプト ハンドラが生成したレスポンスの大きさがこの制限を超える場合は、サーバーから 500 内部サーバーエラー ステータス コードを示す空のレスポンスが返されます。この制限は、Blobstore または Cloud Storage からのデータを提供するレスポンスには適用されません。

リクエスト ヘッダー

着信した HTTP リクエストには、クライアントから送信された HTTP ヘッダーが含まれています。セキュリティ上の理由から、一部のヘッダーは、アプリケーションに到達する前に中間プロキシによってサニタイズ(リスクのある部分などを削除)または修正されます。

詳細については、リクエスト ヘッダーのリファレンスをご覧ください。

リクエストのレスポンス

App Engine は RequestResponseWriter を使用してハンドラを呼び出した後、ハンドラが ResponseWriter に書き込んで戻るのを待機します。ハンドラが戻ると、ResponseWriter の内部バッファに格納されたデータがユーザーに送信されます。

これは実質的に、http パッケージを使用する通常の Go プログラムを記述する場合と同じです。

生成するレスポンスには制限があり、レスポンスはクライアントに返される前に変更される可能性があります。

詳細については、リクエストのレスポンスのリファレンスをご覧ください。

レスポンスのストリーミング

App Engine は、レスポンスのストリーミングをサポートしていません。つまり、リクエスト 1 件のデータをチャンクに分けて順に送信することはできません。コードからのデータ全体が前述のように収集されて、単一の HTTP レスポンスとして送信されます。

レスポンスの圧縮

クライアントが元のリクエストとともに送信する HTTP ヘッダーの中で、そのクライアントが圧縮(gzip 圧縮)されたコンテンツを受け入れられることを示している場合、App Engine はハンドラ レスポンス データを自動的に圧縮し、適切なレスポンス ヘッダーを添付します。圧縮されたレスポンスをクライアントが適切に受信できるかどうかを、Accept-EncodingUser-Agent の両方のリクエスト ヘッダーを使用して判断します。

カスタム クライアントが圧縮されたレスポンスを受信できることを示すには、Accept-EncodingUser-Agent の両方のヘッダーに値 gzip を指定します。レスポンスの Content-Type も、圧縮が適切かどうかを判断するために使用されます。一般に、テキストベースのコンテンツ タイプは圧縮されますが、バイナリ コンテンツ タイプは圧縮されません。

レスポンスが App Engine によって自動的に圧縮されたときは、Content-Encoding ヘッダーがレスポンスに追加されます。

リクエスト期限の指定

リクエスト ハンドラは制限時間内にリクエストへのレスポンスを生成して返す必要があり、この時間は通常は約 60 秒です。この期限に達すると、リクエスト ハンドラは中断されます。Go リクエスト ハンドラが期限を超過すると、プロセスは終了され、ランタイム環境からクライアントに HTTP 500 内部サーバーエラーが返されます。

リクエスト 1 件の処理に 60 秒かかる場合もありますが、App Engine はリクエストの存続時間が短いアプリケーション向け(通常は数百ミリ秒程度)に最適化されています。効率的なアプリは、大部分のリクエストに短時間で応答します。そうでないアプリは、App Engine のインフラストラクチャに合わせて適切にスケールされません。

DeadlineExceededError の一般的な原因と推奨される回避方法については、DeadlineExceededErrors に対処するをご覧ください。

ロギング

ログパッケージには、アプリケーションのログにメッセージを出力する DebugfInfofWarningfErrorfCriticalf 関数が含まれています。GCP Console の [ログ] ページでログを表示して分析できます。また、gcloud app logs read コマンドでログをダウンロードできます。

gcloud app logs read --logs=request_log

次の例は、appengine.Context*http.Request から構築し、要求された URL を記録する HTTP ハンドラを示しています。

package hello

import (
	"net/http"

	"google.golang.org/appengine"
	"google.golang.org/appengine/log"
)

func init() {
	http.HandleFunc("/", Logger)
}

func Logger(w http.ResponseWriter, r *http.Request) {
	ctx := appengine.NewContext(r)
	log.Infof(ctx, "Requested URL: %v", r.URL)
}

環境

Go ランタイムは、appengine.Context インターフェースを介して環境情報へのアクセスを提供します。詳細については、appengine パッケージ リファレンスをご覧ください。
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Go の App Engine スタンダード環境