golangとマイクロサービス
最近ではGo言語がWebサーバで利用される機会もだいぶ増えてきたと思います。
利用例の中にMicroServicesやそれを指向したアーキテクチャで使用されている方の話を聞く機会がちょいちょい有りまして、その界隈のツールセットが幾つか登場しつつありますので紹介してみたいなと思う次第でした。
マイクロサービスの運用となると、モノリシックなサーバの時は考えなかった問題に出会うことが多く、そうしたハマリポイントを各ツールについて学ぶことで避けることも出来ると思いますので、ツールを利用しないまでもチェックしてみるのは参考になるのではないでしょうか。
ツール間の比較
項目 | go-kit/kit | NYTimes/gizmo | micro/micro |
---|---|---|---|
star数(2016/04/17時点) | 3821 | 1341 | 1719 + 704(go-micro) + 78(go-platform) |
サポートするプロトコル | JSON over HTTP, その他独自追加可能 | gRPC, JSON over HTTPなど | Proto-RPC, JSON-RPC |
サービスディスカバリ | 独自のloadbalancerパッケージが担う、DNSやconsulなど様々なプラグインを追加可能 | Configにて指定、HealthCheckに幾つかのタイプを持っている | go-microからConsulを利用可能、各サービスをRegistryパッケージ経由でconsul登録し、利用する形式 |
ログ | 独自、拡張可能、全HTTPリクエストにtransaction_idが振られている | logrusをベースにWrapしている | 特に用意はなし、exampleでは標準のlogを利用していた |
監視 | パラメタをstatsdやprometheusに送信するパッケージが用意されている | rcrowley/go-metricsを利用、graphiteやその他ツールに送信は簡単 | go-platformにあるmetricsから標準ではinfluxdata/telegraf に対してメトリクスを送出 |
Load Balancing | loadbalancerパッケージが登録されたサービスディスカバリ方式とバランシング戦略に応じてノードを選択 | gizmo自体にこうした機能は無い? | Selectorパッケージが要求に応じてノードを選択 |
context | net/context | gorilla/context | net/context |
特記事項 | APIリクエストのtracing機能あり | 3つのツールの中では薄いFWな印象 | micro/micro自体は複数の言語に対するツールセットの提供、golangではmicro/go-microを利用する。高度な運用に向けてはmicro/go-platformを組み合わせる。 |
各ツールセットを眺めての感想
サービス間のやり取りについてはどのツールセットにおいても、JSON over HTTPだけでなくgRPCや、様々なメッセージキューも使えるようになっており、同期・非同期にかかわらずサービスを連携させるための上手い仕組みが用意されています。どのツールも比較的Pluggableに作られており、自前のシステムであっても組み込みは容易かもしれません。
go-kit/kit
go-kit/kit
は個人的にマイクロサービスでの開発において今回3つのツールセットの中では最も程よいサイズで利用しやすいツールかと感じました。
実運用においては障害やパフォーマンス課題が発生した際にどこで発生したものか、そのトレーシングの難しさが課題に上がることがしばしばですが、go-kit/kitではこのケースに対してtracing
パッケージを用いて、どの経由のリクエストで出力されたログなのか追いやすく、運用について考慮がよりなされているように見えます。
また、contextを前提にしたフレームワークは今回調査のツールセットだけでなく多くのWebFWでも増えていますが、contextの利用においては、net/context
ベースのツールが増えている印象があり、その点でもgo-kit/kit
は利用しやすいと感じています。
NYTimes/gizmo
NYTimes/gizmo
は3つのツールセットの中では最もシンプルな作りかなと思いました。
serverとpubsubの2つの形式を選択しつつ各サービスを構築するような形式になっています。
serverはいわゆる通常のHTTPサーバ、pubsubは間にメッセージキューを挟み、リクエストをキューイング、subscriberがそれを読み取り非同期に処理という形です。
利用する側からすると、理解しやすいツールかなと思いまして、全体を踏まえてもそれほどシステムが大きくないのであればgizmoは良い選択肢になりうるのではないでしょうか。
思想についてはこちらを読むのがより良いかと思います。
http://open.blogs.nytimes.com/2015/12/17/introducing-gizmo/?_r=0
micro/micro
micro/micro
については、サービス開発のためのmicro/go-micro
パッケージと、より高度なサービス運用に向けた開発のためのmicro/go-platform
の2つを包含しており、ツール規模が3ツールの中では最も大きいものとなっています。
Go以外からの利用も踏まえたもので、InfluxDBや多くのミドルウェアを用意しての協調・監視・スケーリングを構築可能で、Web側で設定値などを管理することもでき、全てをmicro/microに載せるのであれば、スケーラビリティ含め多くの恩恵を受けられるます。
ただしパッケージはgo-micro
とgo-platform
に分かれおり、本気で運用するのであれば依存ツールが多くなることなども踏まえて、場合によっては大きすぎるツールのようにも見えました。
思想についてはこちらを読むのがより良いかと思います。
Micro - a microservices toolkit https://blog.micro.mu/2016/03/20/micro.html
最後に
今回紹介した3ツールにおいて、見た限りではどれも非常に有用ですので、そのツールごとのクセなどを踏まえつつ利用してみる、もしくは一部のツールだけ利用するなどしてみてはいかがでしょうか。