Go Conference 2018 Autumn に参加してきましたので、自分用のメモ。
といっても、今回は実務でゴリゴリにGolang使ってる人やGolangにかなり深い知見のある人の発表で、
正直自分の知らない単語拾いに行った感じでした。
概要
- 開催場所
- Google Tokyo office 27F
- Roppongi Hills Mori Tower, 6-10-1 Roppongi, Minato-ku, Tokyo, Japan
- 日時
- 2018/11/25 10:00〜19:00
Microservices実装ガイド in Go at メルカリ
Speaker: Hidetatsu Yaginuma @yagi5(株式会社メルカリ)
- メルカリとMicrosrtvices
- メルカリはもともとPHP製のモノシリックAPIだった
- どのようにMicroservicesを実装しているか?
- Protocol Buffers定義 → サービス実装
- Protocol Buffers 定義
- 各サービスのインターフェースを定義
- protoc でProtocol Buffers定義の各プログラム言語のクライアントコードを自動生成している
- すべてのメンバはprotoファイルを読めばAPIのインターフェースを理解できる
- サービス実装
- テンプレートプロジェクトをclone
- rm -rt .git
- git init
- サービスを実装
- テンプレートプロジェクト
- echo と呼ばれている
- 基本的な機能を提供
- ミドルウェア(認証, Logging, Recover...)
- Server Chain(Interceotors)の仕組みを利用している
- Logging
- opencensus, zap(zapgrpc) を利用している
- ミドルウェア(認証, Logging, Recover...)
- 独立したチームを作ることを助ける
- RateLimit / CircuitBreaker
- Goのいいところ
- ネットワーク/ミドルウェアレイヤーと相性がいい
- チューニングがしやすい(go -test bench, pprof)
- メルカリでのMicroservices
- 各チームがメンバーの採用や技術スタックの選定にもオーナーシップを持つ
よくあるJava IT企業で新規プロジェクトをGoで立ち上げてみてる話
Speaker: 武田 洋平(株式会社メディアドゥ)
- 抱えていた課題
- 10年以上構造に変化がないプロダクト
- 追加機能・不具合修正が難しい
- 10年以上構造に変化がないプロダクト
- ビジネスとして成り立つサービスにしたい
- 安定した運用を行いたい。
- Javaをやめよう
- 優先度の高いものから置き換える
- パフォーマンス、開発のしやすさからGolangを導入へ
- 経営層、マネジメント層への説明
- JVMではない点で楽な所もある
- Javaで進める方が将来的にリスクが高い
- 学習コストが低いので、Golangもすぐ書ける
- スモールスタート
- 論より証拠、さっさと動くものを作成
- Golangの採用でよかったもの
- 書き方がかなり制限される
- Good Performance
- みんなの開発が速い
- error handling
- 本格的なサービス運用で、いろんな課題が改めて露呈するはず
- Golang利用企業としてブランディング
- よくあるJavaメインのIT企業の会社もGolangは導入できる
OpenCensus による APM の実現と、未来
Speaker: @munisystem
- アプリのパフォーマンスを気にするのか?
- ユーザ体験が重要な指標
- ユーザ体験とパフォーマンスには重要な関係があるはず
- APM
- Application Performance Management
- パフォーマンス及びその改善位必要なデータの取得
- 取得したデータの可視化、活用できる基盤の構築
- 取り扱う代表的なデータ
- Tracing
- Metrics
- Logging
- Error reporting
- Tracing
- Dstadog APM
- Metrics
- Datadog
- OpenCensus
- APMに必要なデータを収集し外部サービスに提供するフレームワーク
- アプリケーションはデータを収集する部分を実装する
- OpenCensusの欠点
- バックエンド固有の最適化のためのメタデータが付与できない
- ベンダーに依存しない実装により、APMはさらなるエコシステムの成長を遂げるのではないか
Profiling Go Application
Speaker: orisano
- 画像変換サーバの例
- 高速化のために
- Boundary Check Elimination (BCE)
- pprofで遅い原因を特定したら
- ベンチマークを取る
- 高速化のために
- 普段使っているものもカリカリにチューニングされてるわけではない
- Golangはパフォーマンスチューニングしやすい言語
Biscuit Code Reading
Speaker: Yoshiki Shibukawa
Golang で作られた Biscuit
というOSのお話。
- Biscuit
- Monolithic, POSIX-subset OS kernel in Golang
- Multicore
- Kernel-supported threads
- Journaled FS with concurrent, deferred, and group commit
- Virtual memory for copy-on-write and lazily mapped anonymous/file pages
- TCP/IP stack
- In addition to that, we can read the OS implementation in Go
- Monolithic, POSIX-subset OS kernel in Golang
- 当たり前なんですが、OSに関する内容で、だいぶ理解が追いつきませんでした笑
Consider pluggable CLI tool implementation
Speaker: @izumin5210
- grapi
- GoのAPI Serve開発体験を高めるCLI+package
- plugin機構
- ユーザが外から拡張できるようにする
- Extensibility
- Plugin Experience
- 複数人のプロジェクトでも利用できるか?
- 実装・デバッグは簡単か?
- 配布は簡単か?
- 使いやすい・作りやすいplugin機構
フィードバック制御によるGoroutine起動数の最適化
Speaker: monochromegane
- 並行処理とチューニングにおける課題
- 最適な並行数を求めたい
- ブロッキング発生する状況においては、開発者の経験と地道なチューニングに依存
- 従来手法は、短期稼働で即時に反応できる場合に辛い
- 最適な並行数を求めたい
- Kaburayaアーキテクチャ
- 処理やランタイムの特性に依存せずにマシンの負荷に応じて反応的かつ継続的に、並行数を最適化する
- フィードバック制御
- PID制御(P:比例制御、I:積分制御、D:微分制御)
- 制御器の2重ループにした
- Go言語への適用
- バッファ上限値を変更可能なElasticChannel
- 最適な並行数とは
- 高速化率(Speedup)
- 実行効率(Efficiency)
Practical Go Concurrency Design Patterns
Speaker: moriyoshi
- Goのsync.Mutex
- LockしたGoroutine以外からUnLockできる。一般的なセマフォの代わりに使える。
- (例えばJavaのLock系のクラスだと、ロックしたスレッドからしかアンロックできない。)
- LockしたGoroutine以外からUnLockできる。一般的なセマフォの代わりに使える。
- Monitors and Condtion Variables
- Mesa semanntics
- ほとんどのプログラミング言語はこちらを採用
- Hore semantics
- Mesa semanntics
- GolangでのBroadcastを実現する
- channel の closeを利用すること大まかに再現できる
- sync.Cond
Pains and gains of architecting microservices on local dev environment
Speaker: @creasty, @izumin5210(ウォンテッドリー株式会社)
- 気持ちが良い開発体験を提供したい
- 開発環境をDocker化
- ただし、コンテナの起動状況を考えたくない(Dockerを使っていることに気づかないのが理想)
- 解決策:rid
- 開発環境をDocker化
まとめ
若い人もかなりバリバリにGolangで開発してる感じが発表から伝わって来ました。
言語特性もあって、けっこう低レイヤな話になってるパターン多かったかな。
今度は、懇親会にも参加したいです。