| Go on App Engine: tools, tests, and concurrency |
| 13 Dec 2013 |
| Tags: appengine |
| |
| Andrew Gerrand |
| |
| Johan Euphrosine |
| |
| * Background |
| |
| When we [[https://blog.golang.org/go-and-google-app-engine][launched Go for App Engine]] |
| in May 2011 the SDK was just a modified version of the Python SDK. |
| At the time, there was no canonical way to build or organize Go programs, so it |
| made sense to take the Python approach. Since then Go 1.0 was released, |
| including the [[https://golang.org/cmd/go/][go tool]] and a |
| [[https://golang.org/doc/code.html][convention]] for organizing Go programs. |
| |
| In January 2013 we announced |
| [[https://blog.golang.org/the-app-engine-sdk-and-workspaces-gopath][better integration]] |
| between the Go App Engine SDK and the go tool, promoting the use of |
| conventional import paths in App Engine apps and making it possible to use "go |
| get" to fetch app dependencies. |
| |
| With the recent release of App Engine 1.8.8 we are pleased to announce more |
| improvements to the developer experience for Go on App Engine. |
| |
| * The goapp tool |
| |
| The Go App Engine SDK now includes the "goapp" tool, an App Engine-specific |
| version of the "go" tool. The new name permits users to keep both the regular |
| "go" tool and the "goapp" tool in their system PATH. |
| |
| In addition to the existing "go" tool [[https://golang.org/cmd/go/][commands]], |
| the "goapp" tool provides new commands for working with App Engine apps. |
| The "[[https://developers.google.com/appengine/docs/go/tools/devserver][goapp serve]]" |
| command starts the local development server and the |
| "[[https://developers.google.com/appengine/docs/go/tools/uploadinganapp][goapp deploy]]" |
| command uploads an app to App Engine. |
| |
| The main advantages offered by the "goapp serve" and "goapp deploy" commands |
| are a simplified user interface and consistency with existing commands like |
| "go get" and "go fmt". |
| For example, to run a local instance of the app in the current directory, run: |
| |
| $ goapp serve |
| |
| To upload it to App Engine: |
| |
| $ goapp deploy |
| |
| You can also specify the Go import path to serve or deploy: |
| |
| $ goapp serve github.com/user/myapp |
| |
| You can even specify a YAML file to serve or deploy a specific |
| [[https://developers.google.com/appengine/docs/go/modules/][module]]: |
| |
| $ goapp deploy mymodule.yaml |
| |
| These commands can replace most uses of `dev_appserver.py` and `appcfg.py`, |
| although the Python tools are still available for their less common uses. |
| |
| * Local unit testing |
| |
| The Go App Engine SDK now supports local unit testing, using Go's native |
| [[https://developers.google.com/appengine/docs/go/tools/localunittesting][testing package]] |
| and the "[[https://golang.org/cmd/go/#hdr-Test_packages][go test]]" command |
| (provided as "goapp test" by the SDK). |
| |
| Furthermore, you can now write tests that use App Engine services. |
| The [[https://developers.google.com/appengine/docs/go/tools/localunittesting#Go_Introducing_the_aetest_package][aetest package]] |
| provides an appengine.Context value that delegates requests to a temporary |
| instance of the development server. |
| |
| For more information about using "goapp test" and the aetest package, see the |
| [[https://developers.google.com/appengine/docs/go/tools/localunittesting][Local Unit Testing for Go documentation]]. |
| Note that the aetest package is still in its early days; |
| we hope to add more features over time. |
| |
| * Better concurrency support |
| |
| It is now possible to configure the number of concurrent requests served by |
| each of your app's dynamic instances by setting the |
| [[https://developers.google.com/appengine/docs/go/modules/#max_concurrent_requests][`max_concurrent_requests`]] option |
| (available to [[https://developers.google.com/appengine/docs/go/modules/#automatic_scaling][Automatic Scaling modules]] only). |
| |
| Here's an example `app.yaml` file: |
| |
| application: maxigopher |
| version: 1 |
| runtime: go |
| api_version: go1 |
| automatic_scaling: |
| max_concurrent_requests: 100 |
| |
| This configures each instance of the app to serve up to 100 requests |
| concurrently (up from the default of 10). You can configure Go instances to |
| serve up to a maximum of 500 concurrent requests. |
| |
| This setting allows your instances to handle more simultaneous requests by |
| taking advantage of Go's efficient handling of concurrency, which should yield |
| better instance utilization and ultimately fewer billable instance hours. |
| |
| * Conclusion |
| |
| With these changes Go on App Engine is more convenient and efficient than ever, |
| and we hope you enjoy the improvements. Please join the |
| [[http://groups.google.com/group/google-appengine-go/][google-appengine-go group]] |
| to raise questions or discuss these changes with the engineering team and the |
| rest of the community. |