寝ても覚めてもこんぴうた

プログラム書いたり、ネットワーク設計したり、サーバ構築したり、車いじったり、ゲームしたり。そんなひとにわたしはなりたい。 投げ銭は kyash_id : chidakiyo マデ

今日 (2019/09/10) 現在のGAE/goをUPDATEする際の注意点、俺まとめ

f:id:chidakiyo:20190910182707j:plain

Appengine/goが過渡期とでもいいましょうか、
日々変化も目まぐるしく、いろいろ気をつけるべき点もありそうなので雑にまとめました。
ご参考まで。(2019/09/10現在)

GAE/go 1.9 は終わり

f:id:chidakiyo:20190910182745p:plain

画像のとおりです。

警告: Go 1.9 ランタイム バージョンは非推奨になりました。2019 年 10 月 1 日以降、新しいデプロイではこのバージョンを使用できなくなります。2019 年 10 月 1 日までに、Go 1.11 または Go 1.12 を使用するようにアプリケーションをアップグレードしてください。

とあるので、今年の10月1日以降はgo1.9でのデプロイは不可能になります。
すでにデプロイしているものは動くんじゃないか(未確認)と思いますが、速やかに移行しましょう。
go1.11 への移行は比較的容易だと思います。(appengineパッケージも利用できるので)

追記: すでにデプロイされているバージョンは引き続き利用できるようです。 [1]

f:id:chidakiyo:20190911134641p:plain

GAE/go 1.11 は気をつけろ

個人的に気になる点は3点、

  • ランタイムのパフォーマンスが 1.9 より少々悪い
  • 非appengineパッケージのライブラリのRPC部分にメモリリークの問題が有りそう
  • RPCのタイムアウトに気をつけて!

ランタイムのパフォーマンスに関しては、レスポンスの時間などは特に差を感じませんが、
CPUの利用量とメモリの使用量の増加があるように感じています。
Stackdriverのグラフで見た感じで2-3割り程度の差があるように見えます。(ざっくり

非appengineパッケージ(cloud.google.com/go/datastore など)を利用した際に今日現在でRPC部分にメモリリークする箇所がありそうです。
そのため、appengineパッケージをあえて利用することで問題を回避できます。(ですが次の問題があります)

appengineパッケージのRPCに関しては、2nd-genランタイムは多くのRPCを実行しているようで、比較的頻繁にタイムアウトするケースがあります。
service bridge HTTP failed などのログが出力される場合には internal/net.go の以下の画像の箇所のtimeoutを伸ばしてあげると良いようです。(現在修正し様子を見ようとしているところです)

f:id:chidakiyo:20190910183656p:plain

GAE/go 1.12 はまだよくわかりません

一応(?)1.12対応で実装しているものありますが、app.yamlで1.11の設定でデプロイしているので厳密にはよくわかっていません。(1.11と違いがないかもしれません。)

注意点としては、↑のgo1.11でも書いたメモリリークの問題は1.12ランタイムではappengineパッケージが利用不可になっているため、現状、回避策がないと思います。
大量にRPCを実行しているような場合にはインスタンスタイプを上げるなどして神に祈る必要がありそうです。

まとめ

1.9からの移行を皆様急いでいるかと思いますが、ライブラリ併せてのupdateは若干罠があるので(今日 2019/09/10 現在)、
一旦 GAE/go1.11 環境に appengine ライブラリを利用したままの移行が今日現在、私のオススメの予感です。

おまけ

[1] Feature Deprecations  |  App Engine Documentation  |  Google Cloud

fix · f81/appengine@15ec82a · GitHub