Goブログ

App EngineでのGo:ツール、テスト、並行処理

Andrew GerrandとJohan Euphrosine
2013年12月13日

背景

2011年5月にApp Engine向けのGoを公開したとき、SDKはPython SDKの修正版にすぎませんでした。当時、Goプログラムを構築または編成する正式な方法はなかったため、Pythonのアプローチを採用するのが理にかなっていました。その後、Go 1.0がリリースされ、goツールやGoプログラムを編成するための規約が含まれました。

2013年1月には、Go App Engine SDKとgoツールのより良い統合を発表し、App Engineアプリでの従来のインポートパスの使用を促進し、「go get」を使用してアプリの依存関係を取得できるようにしました。

App Engine 1.8.8の最近のリリースでは、App EngineでのGoのより良い開発者体験を提供するさらに多くの改善を発表できることを嬉しく思います。

goappツール

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

既存の「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グループに参加して、エンジニアリングチームや他のコミュニティメンバーと質問をしたり、これらの変更について話し合ったりしてください。

次の記事:FOSDEM 2014でのGoの講演
前の記事:Go Playgroundの内部
ブログインデックス