Gree Tech Talk 06に行ってGoの話を聞いてきた
最近Goづいてるもので、今回のGreeさんの会がGoに関する話だったので行ってきました。 勉強会のメモ投下は宿題みたいなもんなんで、手早く出してしまいますよっと(`・ω・´)
まとめと感想
結構実際にゴリゴリ使ってみた経験から、ベンチマークどうするとか、ハマりどころはこんな所、といった話が展開されていたので、ツール開発にしか使っていない身としてはすごく身になる話が多かったです。
- 会場に来てた人たち、Webサーバに使ってみたという人が多かったみたいで、すげえなーと思ってた。
- 僕はビビリなので運用ツールからやってます。。。
- channelハマりやすいよってのはほんとそう感じるので、もっと積極的に使っていきたい(ぇ
- godepの依存関係管理方針が「ライブラリごと全部突っ込め」になったのは知らなかったけど、納得はできる。
- godep使って公開してる人ー?って言われたので手をあげたら自分だけだったみたいで、びっくりして受け答えにキョドリマしたすいません。
- そもそも、
go get
が今みたいな挙動な時点で。 - でも、やだよね・・・w
- godepのおせっかいpull requestを正座して待ちます。(こなさそう)
- ベンチマークの話はすごく参考になった。
- MQTTをもきゅっとと読む派閥を増やしたい。
- Goのいいところ、の話は完全に同意。
- 懇親会でお話した方から聞いた、ライセンスの話は結構はっとさせられた。
- plugin的アプローチならなんとかなるかもーと思いつつ。無駄も多いからなー。
- cgo使って動的リンク、は先人の教えに従う感じなので、妥当かもなと思う。
というわけで、以下メモメモ。 誤植とか聞き違いとかあったらごめんなさい
pecoの話
- http://go-talks.appspot.com/github.com/lestrrat/go-slides/2014-gree-techtalk6/main.slide
- 牧さん
- pipeを使って目的の行にアプローチできるツール
マーケティングの話
- percolをぱくった
- 後発なら何が違うかを説明しないとね
- 結構紹介を頑張った
percolがpythonでインストール失敗したから作った
- Goで書いたのは、1バイナリにできるので
何が違うかというと
- 紹介頑張ってる
- インストール楽
- brewでかんたん
goroutineでハマった所
- konami command実装した
- ひどうきにじっそうしたらいいんじゃね?
- と思って、書き込みと消去を両方違うchannelつかったら、別々に動いちゃったよね。。。
全部同じチャンネルでやればよかった
非同期処理は、簡単な事をやろうと思ってもすぐハマる。
- 必要でなければ避けた方がいい
テストの話
- CUI周りのテストは面倒
- 基本、グローバル変数の操作を行うので書きづらい
- TermBoxを使ってた
- interfaceを作って刺し込み可能にする
pecoの中で使っている部分だけを切り出したinterfaceを定義
- これを使った構造体をテスト側で定義して、mockとして差し込む
変更を局所化したい場合
- mock化するときにguardとかして
あとからinterfaceとかできるので、最初から考えずに書いてってしまう方がいい
汎用ライブラリ
- 切り出す必要とか、ないよ!
自分のバイナリに入れてしまうのだから、自分用にまるっとパクってpatchしちゃってもいい。
godepなんかは、依存ライブラリ全部突っ込んでしまえ、という思想になってきてる
クロスコンパイル
- cgoはまる
Practical Go
Goの出会い
- InfluxDBを興味がてら見ていて、Contributionしたり、自分で書いたりしてた
- Grafanaとかで簡単にデータをグラフ化出来る
Application Monitoring してますか?
- Monitoring超大事
- performance劣化などに気づけ無い
- monitoringしていれば、たいていの問題に気づける
- Goをどうやってmonitoringするか?
- pprof
- memstats
- 必要な項目を自分たちで出力・収集
どう取ってるか
- pkg/expvar
- 標準パッケージ
- APIを叩くだけで取れる
- 敵的に外部に出力すると評価に便利
モニタリングを通して
- どのくらいのコネクションを使えるか
- どれだけのGoroutineを使ってるか
どういった負荷特性があるか
Webのproxyでもいいけど、ちゃんと取りたければGoではく
GoでServerを書くときのTips
- Echoサーバを書いてみよう
- 鸚鵡返しする奴
それはいいとして。
Protocolを決める
- httpとかあり物に乗るのがいい
- コマンドに沿った機能を実装する
- memcachedみたいなものを作ってみると、結構面白い
config / signal handling / restart周りを書く
ranking serverを作ってみよう
- skiplist
- コードさんぷるー
GoのMQTT Serverを書いて導入してみた
- M2M/IoT向けのPUB/SUBプロトコル
2byteの固定ヘッダ+可変ヘッダ payloadは任意
メッセージのQoS
- WIll, Retain, Sessionなどの便利機能
headerが短いのでTrafficがおとく
RedisのPubSubと何が違うのか
社内での利用例
- 一部異常値系をMQTTで収集
VS Mosquitto
- CのMQTT Server
- そこそこ比較できた!うれしい!
GolangのServerモデル
1 connection = 1 goroutine
- GoのSchedulerがスレッド内で調整
-
- forkしたりすれば一応できるが。。。
- すぐpanicするので、あんまり良くない
[]byte Performance
- できれば、事前割当した部分を使いたい
QA
- なんでchannel使わずにlock使ってるの?
- 一回ベンチマークしてみたら、すごく遅かった
- (追記)わかりやすいイメージ > https://twitter.com/lestrrat/status/514739324051398656
Experience Building InfluxDB with golang
- (スライドURL見つけられてない)
- InfluxDBのひと!
InfluxDBとは
- 時系列DB
- Go
- 単一バイナリ
- Strage Engine
- LevelDB, RocksDB, HyperLeverDB,...
単一サーバからクラスタまでいける
InfluxDBは2013/01からGoになり始めた
- Goよかったので!
Goの良かった点
- シンプル
- コードがreadableになる
- readable = 理解しやすい!
- Scalaと比較すると、ずっと読みやすい
- 読みやすいコードは、メンテナンスしやすい
- パフォーマンス
- 他のいろんな言語よりもずっとパフォーマンスがいい
- ロバストネス
- Simple Deployment
- 外部依存をしなくて良くなったのが、とても大きい
- DevOpsツールとして、依存無くdeploy出来るのはとても重要
- goraftは害ぶらりぶらりとして使ってる
- bugがあった際、go getして新しいバージョンを持ってきていた
- だが今は、これを
_vendor
以下に入れて、直接リポジトリに入れてしまった。
- idiomsがわかりやすい
- channels of channels
- これでループする
- cacheやstateにはsync.Mutexを使おう
- Goはまだまだ新しい言語!
- どんどんPull Request & Code reviewしよう
GCについて
GCは敵ですね(`・ω・´)
Timeoutどうするか
- Example: Timeout
- Example: Influx cluster
- Timeout Problems
- GC Pauses
- Large Requests
- Overloaded network
- Slow Server
- All occur under load
- All lead to connection
単純な解決策はないよ!
最初はgoraftを使っていた
- でも、途中から新しいRaftライブラリを中で実装した
まだまだ若い言語なので、ドンドンライブラリを書いていこう!
パフォーマンスtips
- pprof / memprofile
- memory leakのサンプル
あらゆるレイヤでベンチマークを書こう
Goのベンチなら
go test -bench=. <pkg>