GAE/Go の go1.11(2nd-gen) ランタイムが今どんな感じか改めて試してみた

GAE/Go 1.11 の次世代ランタイム（2nd-gen)がリリースされたタイミングで [早速GAE/Go go1.11の次世代ランタイム試してみた](https://qiita.com/chidakiyo/items/07b7ec09c06efdfe2edb) という記事を書きましたが、その後どんな感じになったか、既存の Go1.9 で実装されているアプリケーションが比較的容易に移行できそうかという観点で改めて触ってみました。


GAE/Go1.11 (2nd-gen) は 2019/01/10 の今日現在まだ Beta バージョンとなります。
また、近い将来、 Datastore も Firestore Datastore モードへの移行があるので、 Datastore 周りのパフォーマンスはこの限りではない可能性があります。
https://cloud.google.com/datastore/docs/upgrade-to-firestore

## 確認の観点

主に、 go1.9 (1st-gen) のランタイムで動いていたアプリケーションが大きな変更をせずとも、 appengine ライブラリを利用したまま go1.11 (2nd-gen) ランタイムで動作させ、運用に支障がない（ログがリクエストスコープでまとまる、 trace が出るなど基本的な）ことを確認しています。

- ログ
    - リクエストスコープで 1st-gen と同様にまとまるか
- Trace
    - Datastore へのアクセスの Trace が表示されるか
    - urlfetch を利用した外部サイトへのアクセスの際に Trace が表示されるか
- TQ
    - delay package が利用できるか
- パフォーマンス
    - 東京リージョンでのリクエスト応答時間
    - Datastore の応答時間 (appengine library)
    - Datastore の応答時間 （Cloud Datastore library)
    - 外部サイトへの接続パフォーマンス （urlfetch)
    - 外部サイトへの接続パフォーマンス （http.get)
    - デプロイ時間（ざっくり）

という感じです。

確認に利用したコードは [こちら](https://github.com/chidakiyo/benkyo/tree/master/appengine-go111) になります。

## 1. ログがリクエストスコープでまとまるか

コードは [こちら](https://github.com/chidakiyo/benkyo/blob/master/appengine-go111/app/01_log.go) です。

実行結果として、1st-gen と同様にログがまとまって表示されます。

<img width="606" alt="スクリーンショット 2019-01-08 15.38.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/ecfc83b9-ac17-c28f-91b6-f276e3a42ef7.png">

ログの出力はそのまま移行できそうです。

## 2. Datastore へのアクセスの Trace が表示されるか

コードは [こちら](https://github.com/chidakiyo/benkyo/blob/master/appengine-go111/app/02_AE_Datastore.go) になります。

### Datastore への書き込みの場合
<img width="772" alt="スクリーンショット 2019-01-08 15.58.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/ec22645b-54e9-94ad-7caf-12e5846f0e6c.png">

Timeline 上に Put の Trace が問題なく表示されます。

### Datastore の読み込みの場合
<img width="760" alt="スクリーンショット 2019-01-08 16.34.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/7f968e73-6eaa-7de2-1e91-3e7fe88f4bc4.png">

同様に Timeline 上に Get の Trace が表示されます。

いずれも appengine パッケージを利用すればそのまま移行できそうです。

## TQ の delay パッケージが利用できるか

問題ないはずですが一応確認。

コードは [こちら](https://github.com/chidakiyo/benkyo/blob/master/appengine-go111/app/06_TQ_delay.go) になります。

<img width="719" alt="スクリーンショット 2019-01-08 18.13.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/52e6bf4f-2359-50cb-8f5f-86f6bc2e076a.png">

TQ を詰め込んだリクエストのログも、 TQ で起動されたリクエストのログも両方出力されているので、問題ないです。

ただし、 go1.9 のアプリケーションで詰んだタスクを go1.11 で実行しようとするとうまくいきませんでした。

## 東京リージョンでのリクエスト応答時間

リクエスト応答時間の確認には [こちら](https://github.com/chidakiyo/benkyo/blob/master/appengine-go111/app/01_log.go) のコードを利用しました。

内部的にはログを吐いているだけで何もしていません。

ざっくりですが、

|項目|応答時間|
|---|---|
|ブラウザ上|35 msec 近辺|
|GAEのログ上|3-4msec 近辺|

という感じで問題なさそうです。

## Datastore 応答時間(Appengine ライブラリ）

確認に利用したコードは [こちら](https://github.com/chidakiyo/benkyo/blob/master/appengine-go111/app/02_AE_Datastore.go) です。

### Datastore への書き込み

<img width="556" alt="スクリーンショット 2019-01-09 15.31.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/7d8df50c-5192-93f9-7044-510f165cf883.png">
<img width="789" alt="スクリーンショット 2019-01-09 15.36.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/99165796-4587-cf0f-c32f-f03227599670.png">

平均 22 msec ぐらい

### Datastore からの読み込み

<img width="568" alt="スクリーンショット 2019-01-09 15.40.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/aa67af20-aa01-a610-7b42-ba5388699a34.png">
<img width="784" alt="スクリーンショット 2019-01-09 15.36.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/504b6f5f-fd14-2a48-1d11-acd35614612d.png">

たぶん、平均 10 msec ぐらい

## Datastore 応答時間（Cloud Datastore ライブラリ)

確認に利用したコードは [こちら](https://github.com/chidakiyo/benkyo/blob/master/appengine-go111/app/03_Cloud_Datastore.go) です。

### Datastore への書き込み
<img width="719" alt="スクリーンショット 2019-01-09 15.50.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/f6521d84-9593-09ca-9083-1851570ff9f3.png">

ちょっと遅いです。
たぶん、平均 100 msec ぐらい

### Datastore からの読み込み

諸般の理由で行わず。w

## 外部サイトへの接続(urlfetch)

確認に利用したコードは [こちら](https://github.com/chidakiyo/benkyo/blob/master/appengine-go111/app/04_urlfetch.go) になります。

<img width="501" alt="スクリーンショット 2019-01-10 14.39.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/61fc449d-7e95-d1a2-31f1-64b4fef69fc2.png">
<img width="809" alt="スクリーンショット 2019-01-10 14.39.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/4173464e-e1d2-f9d9-9663-c04fb1cb3df6.png">

思ってたよりだいぶ速いのですが、
平均で 3 msec ぐらい

## 外部サイトへの接続(http.get)

確認に利用したコードは [こちら](https://github.com/chidakiyo/benkyo/blob/master/appengine-go111/app/05_http_get.go) です。

<img width="503" alt="スクリーンショット 2019-01-10 14.53.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/bb56cb1c-796f-8a7b-219c-0abec88abf44.png">

trace はもちろんそのままでは出ません。
<img width="813" alt="スクリーンショット 2019-01-10 14.54.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/c6927f6f-a8a2-4d94-f456-b35a1be526b4.png">

こちらが
平均で 1.1 msec ぐらい。

## デプロイ時間

だいたい 3分半 ぐらい（コード量殆ど無いアプリケーションで）

## まとめ

- ログがリクエストスコープでまとまらないのがいつの間にやら update されてまとまるようになっていた。
- 前回の記事を書いた時点ではパフォーマンス怪しげだったが、ほぼ問題ないレベルになっていました。（Tokyo リージョン）
- Cloud Build 経由のデプロイになるため、デプロイ時間はちょっと遅くなります。

ということで、GAE/Go 1.11 が GA になるタイミングでは 1.9 -> 1.11 移行をしても比較的問題がなさそうな雰囲気じゃないかなと思います。
Go1.11になることで、プロジェクトがgopath配下に置く必要がなくなるので（go mod利用）、CDなどは少しやりやすくなりそうです。

それでは。