App Engine上のGo:ツール、テスト、そして並行処理

Go on App Engine: tools, tests, and concurrency by Andrew Gerrand and Johan Euphrosine

背景

2011年5月にApp Engine向けのGoをリリースしたとき、SDKは単にPython版SDKを改変しただけのものでした。 当時はGoプログラムをビルドしたり構成したりするための標準的な方法が存在しなかったため、Pythonのやり方を踏襲するのが理にかなっていました。 それ以来Go 1.0がリリースされ、goツールや、Goプログラムを構成するための慣習が整いました。

2013年1月には、App Engine向けGo SDKとgoツールとのより良い統合を発表し、 App EngineアプリでGoの標準的なインポートパスを使うことを推奨するとともに、アプリの依存関係を取得するために 「go get」を使えるようにしました。

最近リリースされたApp Engine 1.8.8に伴い、App Engine上のGoにおける開発体験のさらなる改善を発表できることを嬉しく思います。

goappツール

Go App Engine SDKには、App Engine専用版の「go」ツールである「goapp」ツールが新たに含まれるようになりました。 この新しい名前により、ユーザーはシステムのPATHに通常の「go」ツールと「goapp」ツールの両方を保持できます。

既存の「go」ツールのコマンドに加えて、「goapp」ツールはApp Engineアプリを扱うための新しいコマンドを提供します。 「goapp serve」コマンドはローカルの開発サーバーを起動し、 「goapp deploy」コマンドはアプリをApp Engineにアップロードします。

「goapp serve」と「goapp deploy」コマンドの主な利点は、ユーザーインターフェースが単純化されていることと、 「go get」や「go fmt」といった既存のコマンドとの一貫性です。 たとえば、カレントディレクトリにあるアプリのローカルインスタンスを実行するには、次のようにします。

$ goapp serve

App Engineにアップロードするには次のようにします。

$ goapp deploy

サーブやデプロイの対象となるGoのインポートパスを指定することもできます。

$ goapp serve github.com/user/myapp

さらに、特定のモジュールをサーブまたはデプロイするためのYAMLファイルを指定することもできます。

$ goapp deploy mymodule.yaml

これらのコマンドは dev_appserver.pyappcfg.py のほとんどの用途を置き換えられますが、 あまり一般的でない用途向けにPythonのツールも引き続き利用できます。

ローカルでのユニットテスト

Go App Engine SDKは、Go本来のtestingパッケージと 「go test」コマンド(SDKでは「goapp test」として提供されます)を使った ローカルでのユニットテストをサポートするようになりました。

さらに、App Engineのサービスを使うテストも書けるようになりました。 aetestパッケージは、 開発サーバーの一時的なインスタンスにリクエストを委譲する appengine.Context の値を提供します。

「goapp test」とaetestパッケージの使い方について詳しくは、Goのローカルユニットテストについてのドキュメントを参照してください。 なお、aetestパッケージはまだ登場したばかりであり、今後さらに機能を追加していきたいと考えています。

並行処理サポートの改善

アプリの各動的インスタンスが処理する同時リクエスト数を、 max_concurrent_requestsオプション (自動スケーリングモジュールのみで利用可能)を設定することで 構成できるようになりました。

以下は app.yaml ファイルの例です。

application: maxigopher
version: 1
runtime: go
api_version: go1
automatic_scaling:
  max_concurrent_requests: 100

これは、アプリの各インスタンスが同時に最大100件のリクエストを処理するように構成します(デフォルトの10件から引き上げています)。 Goのインスタンスは最大500件までの同時リクエストを処理するよう構成できます。

この設定により、Goの効率的な並行処理を活かして、インスタンスがより多くの同時リクエストを処理できるようになります。 これによってインスタンスの利用効率が向上し、最終的には課金対象のインスタンス時間を削減できるはずです。

結論

これらの変更により、App Engine上のGoはこれまで以上に便利で効率的になりました。この改善を楽しんでいただければ幸いです。 これらの変更についてエンジニアリングチームやコミュニティの他のメンバーと質問したり議論したりするには、 ぜひgoogle-appengine-goグループにご参加ください。

By Andrew Gerrand and Johan Euphrosine