2023/06/02、Go Conference 2023に参加してきました。初参加です。オンライン開催なのでオンライン参加です。

https://gocon.jp/2023/

しっかり集中してカンファレンス参加したのは JJUG CCC 2021 Spring以来?

まとめ

一番残しておきたいまとめを最初に書いておきます。

セッションの内容は実務レベルのものから実装中身深掘りなど、様々でした。 個人的には実装中身深掘りシリーズが目から鱗で、自分ひとりでコード読んでても理解できなさそうなところが丁寧に解説されていて、 それを参考にチャレンジしようという気持ちになりました。そしてまとめ方皆さんとても上手い。。

特に、

  • Goのメモリ管理
  • echoなどのHTTP Router処理
  • sync.Mutex

これらは普段お世話になってばかりなのでしっかり理解したい。

また、明日から業務に即活かすためにやることは以下が浮かびそう

会社の人にもいろいろ展開していこう。


セッション聞いたメモ

以下、セッションを聞いた自分用メモです。あまり整理されてないので元のスライドなどきちんと読むのがよしです。

タクシーアプリ『GO』高速マッチングシステムで実践したGoチューニングテクニック

https://gocon.jp/2023/sessions/A1-SP/

  • リクエスト→レスポンスすぐに返すのではなく、数秒レベルのバッチで一気にレスポンス返す
  • マッチングロジックはPythonでステートレス、それ以外はGo
  • golang.org/x/sync/semaphore で並列数制御
  • errorgroupは1つのgo routineしか返せないので、独自errorgroupを作成

アーキテクチャ設計の試行錯誤が垣間見れる感じで面白かった。

無理なく始めるGoでのユニットテストの並行化戦略

https://gocon.jp/2023/sessions/A2-SP/

スライド: https://speakerdeck.com/shohata/go-conference-2023

業務でgo-txdb使いはじめたとこだが若干使いにくい部分あったのでpgtxdbもwatchしたいとこ

Fun with Slices

https://gocon.jp/2023/sessions/B3-L/

スライド: https://docs.google.com/presentation/d/e/2PACX-1vQDvy-3KT6-cqbxzJ2UY8sFe86mOknAGJiP5aDD_FwWusezgVzdItYIiVDxNMX9O30k10IX27PNI9Hx/pub?start=false&loop=false&delayms=3000&slide=id.g56441dcac2_0_14

  • Sliceの内部構造の話
  • reflect.SliceHeaderでスライスのヘッダ要素みれる
  • Sliceから[:1]などで取り出したものにappendしたりすると、元の要素にも影響する
    • メモリ空間を考えてみれば当たり前な話
  • 並行処理でSliceに追加するときはsyncでなくchannel使おう!
    • Don’t communicate by sharing memory, share memory by communicating.
    • Read the proverbs! (Go Proverbs を読もう!)

Go Proverbs、又聞きばかりなのできちんと読まないと。

「Go Style Guide」から学んだ可読性の高いコードの書き方

https://gocon.jp/2023/sessions/A4-S/

スライド: https://speakerdeck.com/andpad/go-style-guide-karaxue-ndake-du-xing-nogao-ikodonoshu-kifang

  • https://google.github.io/styleguide/go/
  • ゼロ値は設定しない、それによってOptionの場合は指定した項目を目立たせる
  • Genericsは使わないで済むなら使わない
    • interface受け取るだけで済むならGenericいらない
  • fmt"を出力するなら、\"でなく%q使おう
  • pkg名でローカル変数と被りそうなものは使わない
    • かぶるならpkgsuffixつける、net/urlurlpkgとか
  • すべての場面で正しいというわけではない、チームのフェーズや規模等によって重要視するものは異なる

ブクマだけしてて読んでなかった、チームで輪読したいところ。

次なるrouterパッケージ選定のしざまと決め手について

https://gocon.jp/2023/sessions/A6-SP/

スライド: https://speakerdeck.com/yuzuy/ci-narurutapatukezixuan-ding-nosizamatojue-meshou-nituite

評価軸つくって〜なところ丁寧にされてて好印象でした。

どうしてもcgoから逃げられなくなったあなたに知ってほしいcgoの使い方入門

https://gocon.jp/2023/sessions/B7-L/

スライド: https://speakerdeck.com/sakiengineer/dousitemocgokaratao-gerarenakunatutaanatanizhi-tutehosiicgonoshi-ifang-ru-men

  • スライド見やすい、cgo導入による負担の大きさのとこなど
  • recoverできなくなるのとか辛そう
  • cgoに関する公式Docはとても少ない
  • https://www.swig.org/
    • SWIGの使い方など
    • 文字列の扱いの難しさ

SWIG知らなかった、頭の片隅に置いておく。

EchoやGinはなぜ速いのか?Goで高速なHTTP routerを作るコツ

https://gocon.jp/2023/sessions/B8-S/

スライド: https://docs.google.com/file/d/1Jh0j2UD4VZjck_34XEA3OgzruLoiZeci/edit?filetype=mspresentation

  • sync.PoolがHTTP Routerのユースケースと相性よい
  • echo,ginはRadix tree
  • 静的ルーティングならTrie treeがはやい、それつかえば?
    • /healthがマッチするが/healthyでくる場合、backtrackが発生、これに弱い
  • Radix treeは実装が複雑
  • パスパラメータ、独自Contextに持たせたほうが速い
    • chiみたいにcontext.Contextだと遅い
  • 関数呼び出しを減らす、echoはgoto利用(サブルーチン呼び出し的に)

echoの中身片足突っ込もうとしてやめた自分にとってはかなり面白い内容だった。

Go1.19から始めるGCのチューニング方法

https://gocon.jp/2023/sessions/B9-S/

スライド: https://speakerdeck.com/hagatake/go1-dot-19karashi-merugcnotiyuningufang-fa

  • GoのGCの中身詳しく解説
  • GOGC,GOMEMLIMITをセットして実際のプロダクトでパフォーマンス確認
  • Goが完全制御化、Goだけが動いているコンピューティングリソースであればGOMEMLIMIT導入の余地あり

スライド見やすかった、あとで振り返る。

Go1.20からサポートされるtree構造のerrの紹介と、treeを考慮した複数マッチができるライブラリを作った話

https://gocon.jp/2023/sessions/A10-S/

スライド: https://speakerdeck.com/convto/introduction-of-tree-structure-err-added-since-go-1-20

  • Go 1.20のエラー連結はtree構造
  • proposal golang/go 53435
  • splitとかwalkとか、需要あるかもだがデザインについて議論の余地→まずはコア仕様のみ

個人的には今のところ今の仕様通りで困ってなかったが…場合によっては困るかも、今後の動向に注目したい。

Goのメモリ管理

https://gocon.jp/2023/sessions/B11-S/

スライド: https://speakerdeck.com/ymotongpoo/memory-management-in-go

  • goroutineのスタックは2KB
  • ヒープに注目
  • オブジェクトを初期化→サイズにあったmcentral内のmspanが割り当てられる
  • 基本的なことからざっくりheapメモリまわりの紹介
  • size/runtime/sizeclasses.go で様々なサイズのmspanがみれる
  • TCMalloc : Goのspanアロケートはこれベース、これだけでも覚えて帰ろう

メモリ管理の基礎からGoでの利用方法まで、Overview分かる感じでよかった。

High performance regular expressions using RE2 and WebAssembly, no cgo required

https://gocon.jp/2023/sessions/B12-S/

コアな内容。Javaの正規表現も遅くてC++実装の呼ぶ、とか以前やったの思い出した…。Go標準の正規表現遅いってことは覚えておくとよいのかも。

net/http/httptest.Server のアプローチをテスト戦略に活用する

https://gocon.jp/2023/sessions/A13-S/

スライド: https://speakerdeck.com/k1low/go-conference-2023

  • テストの実行速度と決定性でSmall,Medium,Largeテストに分ける
  • アーキテクチャ未完状態ではMediumテストで、アーキテクチャの変更にもつよく
  • シナリオごとにYAMLファイル作成、それをもとにhttp clientなど実行
  • https://github.com/k1LoW/runn

分散サービスで有用そうなアプローチ。モノリスであればここまでやる必要性はなさそう。

sync.Mutexの仕組みを理解する

https://gocon.jp/2023/sessions/A14-S/

スライド: https://speakerdeck.com/ffjlabo/sync-dot-mutexnoshi-zu-miwoli-jie-suru

  • sync.Mutex,stateとsema2つの状態変数
  • stateをロック状態にしたとしても、1goroutineがアクセスしていることを保証できない→semaを用いてロック確保
  • semaでのロック取得も無理なら次にスケジューリングされるまでgoroutineは一時停止
    • スケジューリングのruntimeまわりはあまり理解できていないかも
  • semaだけでよいのでは?
    • 基本はgoroutine空間、競合が起きたときはruntime空間
    • goroutine,runtimeの間のコンテキストスイッチを減らす

しっかり深掘りされてて良かった、途中のまとめで理解度確認しながら、かつ更になぜ?が生まれていく流れが面白かった。


以上。裏セッションだったりLTだったりは省略、気になるところは後で振り返る。