mercari.go #11
- connpass: リンク
- ハッシュタグ: <code>#mercarigo</code>
今回もお弁当とドリンクがありました!ありがたや
[追記:2019年10月12日]
[Mercari Engineering Blog](https://tech.mercari.com/entry/2019/10/11/160000) にて、本イベントの記事が公開されました。
発表資料が載せてあります。ありがたや🙏
1. About error handling in Go
登壇者:jd さん(@JehandadKamal)
資料 (正式に共有されたものでないので、発表の内容が少し異なります)
Errors are values
”Errors are values ” という考え方。
Goでよくあるエラー処理パターン
- エラーをラップしてより詳細な情報を付与する
- 専用構造体を作る
- スタックトレースを構成する
”Error is your domain”
Domain Error Struct を作成する。
type Error struct {
Op Op
Kind Kind
Serverity zapcore.ErrorLevel
Err error
}
- Op:Operation → 関数名とか
- Kind:エラー種別 → NotAvailable, NotFound といったもの
- Serverity:エラーレベル
- Err:エラー内容
上記のような構造体を作る理由
error を比較するときは、基本的に文字列の比較になるため取り回しが悪い
→ ”NotFound” という文字列を比較するとかとか
Domain Error Struct を作れば Kind での比較などが可能になる。
加えて、操作内容やエラー種別とか情報を付与できる。
これ大事!
Remember ”Error is your domain”
エラーの分割方法
2. singleflight
登壇者:@nsega さん
singleflight
同じ処理が複数回実行される場合に、一回だけ実行して、その結果を使い回すというもの。
→ キャッシュに似ていますが、違いは後述します。BFF レイヤーで活躍
→ マイクロサービスにおいて、複数のAPIにリクエストを投げて、レスポンスを集約するようなときに有効。ここ にある3つの関数さえ押さえればOK。
singleflight のユースケース
初見だと、キャッシュとなにが違うのか分かりづらいと思います。
ここらへんを見ると singleflight のユースケースがわかってくると思います。
Q&A
Q. goroutine で使うのはどうでしょう?
A.
singleflight は扱いが難しいので、呼び出し元がわからなくなると、デバッグが余計難しくなる。
よって、goroutine ではあまり使わない方が良さそう。
→ 呼び出し元は明確な方が追跡しやすくていいと思う。
3. ISUCON9予選のベンチマーカーについて(TBD)
登壇者:カタツイさん(@catatsuy)
上記資料が全てです!
ISUCON の裏側、つまりベンチマーカーを作った話です。
こんなことを考えて作られているんだと知ることができ、
めちゃくちゃおもしろかったし、勉強になりました!
ぜひ、上記資料読んでみてください!