読者です 読者をやめる 読者になる 読者になる

絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

Gree Tech Talk 06に行ってGoの話を聞いてきた

https://atnd.org/events/55464

最近Goづいてるもので、今回のGreeさんの会がGoに関する話だったので行ってきました。 勉強会のメモ投下は宿題みたいなもんなんで、手早く出してしまいますよっと(`・ω・´)

まとめと感想

結構実際にゴリゴリ使ってみた経験から、ベンチマークどうするとか、ハマりどころはこんな所、といった話が展開されていたので、ツール開発にしか使っていない身としてはすごく身になる話が多かったです。

  • 会場に来てた人たち、Webサーバに使ってみたという人が多かったみたいで、すげえなーと思ってた。
    • 僕はビビリなので運用ツールからやってます。。。
  • channelハマりやすいよってのはほんとそう感じるので、もっと積極的に使っていきたい(ぇ
  • godepの依存関係管理方針が「ライブラリごと全部突っ込め」になったのは知らなかったけど、納得はできる。
    • godep使って公開してる人ー?って言われたので手をあげたら自分だけだったみたいで、びっくりして受け答えにキョドリマしたすいません。
    • そもそも、go getが今みたいな挙動な時点で。
    • でも、やだよね・・・w
    • godepのおせっかいpull requestを正座して待ちます。(こなさそう)
  • ベンチマークの話はすごく参考になった。
    • MQTTをもきゅっとと読む派閥を増やしたい。
  • Goのいいところ、の話は完全に同意。
  • 懇親会でお話した方から聞いた、ライセンスの話は結構はっとさせられた。
    • plugin的アプローチならなんとかなるかもーと思いつつ。無駄も多いからなー。
    • cgo使って動的リンク、は先人の教えに従う感じなので、妥当かもなと思う。

というわけで、以下メモメモ。 誤植とか聞き違いとかあったらごめんなさい

pecoの話

マーケティングの話

  • 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がスレッド内で調整
  • GolangDaemonを作るには

    • forkしたりすれば一応できるが。。。
    • すぐpanicするので、あんまり良くない
  • []byte Performance

    • できれば、事前割当した部分を使いたい

QA

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は敵ですね(`・ω・´)

    • 時系列データは2GB程度の小さなheap data
    • Go 1.4 + GC planがよかった
    • でも10GB以上のheapががが
      • import "unsafe"つかってGC回避してしまえ
      • 怖いかなw
  • 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>