> Source: https://www.ymotongpoo.com/works/goblog-ja/appengine-dec2013/


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

[Go on App Engine: tools, tests, and concurrency](https://go.dev/blog/appengine-dec2013) by Andrew Gerrand and Johan Euphrosine

## 背景

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

2013年1月には、App Engine向けGo SDKとgoツールとの[より良い統合](/blog/the-app-engine-sdk-and-workspaces-gopath)を発表し、
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」ツールの[コマンド](/cmd/go/)に加えて、「goapp」ツールはApp Engineアプリを扱うための新しいコマンドを提供します。
「[goapp serve](https://developers.google.com/appengine/docs/go/tools/devserver)」コマンドはローカルの開発サーバーを起動し、
「[goapp deploy](https://developers.google.com/appengine/docs/go/tools/uploadinganapp)」コマンドはアプリをApp Engineにアップロードします。

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

```shell-session
$ goapp serve
```

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

```shell-session
$ goapp deploy
```

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

```shell-session
$ goapp serve github.com/user/myapp
```

さらに、特定の[モジュール](https://developers.google.com/appengine/docs/go/modules/)をサーブまたはデプロイするためのYAMLファイルを指定することもできます。

```shell-session
$ goapp deploy mymodule.yaml
```

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

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

Go App Engine SDKは、Go本来の[testingパッケージ](https://developers.google.com/appengine/docs/go/tools/localunittesting)と
「[go test](/cmd/go/#hdr-Test_packages)」コマンド（SDKでは「goapp test」として提供されます）を使った
ローカルでのユニットテストをサポートするようになりました。

さらに、App Engineのサービスを使うテストも書けるようになりました。
[aetestパッケージ](https://developers.google.com/appengine/docs/go/tools/localunittesting#Go_Introducing_the_aetest_package)は、
開発サーバーの一時的なインスタンスにリクエストを委譲する `appengine.Context` の値を提供します。

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

## 並行処理サポートの改善

アプリの各動的インスタンスが処理する同時リクエスト数を、
[max_concurrent_requests](https://developers.google.com/appengine/docs/go/modules/#max_concurrent_requests)オプション
（[自動スケーリングモジュール](https://developers.google.com/appengine/docs/go/modules/#automatic_scaling)のみで利用可能）を設定することで
構成できるようになりました。

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

```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グループ](http://groups.google.com/group/google-appengine-go/)にご参加ください。

By Andrew Gerrand and Johan Euphrosine

