go言語でのマイクロサービスフレームワークの雑な比較メモ

More than 3 years have passed since last update.


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-microgo-platformに分かれおり、本気で運用するのであれば依存ツールが多くなることなども踏まえて、場合によっては大きすぎるツールのようにも見えました。

思想についてはこちらを読むのがより良いかと思います。

Micro - a microservices toolkit https://blog.micro.mu/2016/03/20/micro.html


最後に

今回紹介した3ツールにおいて、見た限りではどれも非常に有用ですので、そのツールごとのクセなどを踏まえつつ利用してみる、もしくは一部のツールだけ利用するなどしてみてはいかがでしょうか。