Room 3100

martiniとgin

概要

martiniというGo向けのWebアプリケーションフレームワーク(WAF)があります。 最近リリースされて、すぐにGoコミュニティ界隈で話題になりましたね。

また、ginという別のWAFも出て、 こちらはmartiniより40倍以上も速いぜと主張しています。

どちらか迷った挙句、速さは正義ということで、ginを触ってみたのですが 結局martiniを使うことにしました。

martiniについて

martiniは機能拡張を容易にするため、DIを利用しています。 この実装として、リフレクションを利用しています。

一方、Gonet/httpパッケージはそうした実装にはなっていません。 リフレクションを利用することはパフォーマンス的にも2桁近く遅くなることがある他、 ランタイムエラーの原因にもなるなどから、一部で批判を受けました。 (そもそもDIはJavaでの古き悪しきイメージが強いのかもしれません。)

Three reasons you should not use Martini - Stephen Searles

開発者の@codegangstaことJeremy Saenzはこうした批判に対して記事を書いていて、 martiniのDI実装が完璧ではないことを率直に認め、 negroniという別のアプローチも試みるよと書いています。

My Thoughts on Martini - Code Gangsta

既にmartiniを使っている人向けには、ぜひ今後とも使い続けて欲しい、とコメントしています。

ginについて

martiniが批判を受け、かつそれより高速で同じように記述できるginが出てきた今 martiniは無用の長物なのでしょうか。

Show HN: Gin – Golang Martini-like web framework - Hacker News

ginが登場すると、すぐにHacker News上などで反応がありましたが、 実装はかなり薄くなっているため、その部分をどう捉えるかという選択の問題になりそうだなという感想を抱きました。 (ささっと簡単なWebAPIを用意するくらいだったら、高速なginのが良いかもしれません。)

Go黎明期から積極的にブログなどで情報公開している@mattnさんも、以下のようにツイートしています。

また、個人的に使ってみた感想としては、

  • まだ連携ライブラリが少ない(逆に言えば貢献のチャンス?)
  • まだまだ実装が変わりそう

な印象を受けました。

例えば、redisと連携しようとして、redigoなんかを使おうとした場合、 martiniではMap機能があるので簡単に取り込んで利用できますが ginではそういった機能は用意されていません。(あくまで現時点では。)

もっとも、連携機能については、PRもあがっていて、それほど時間はかからずに、改善されるのではないかと思います。

Wrap http.ResponseWriter to greatly increase middleware/logging accesibilty by zmarcantel · Pull Request #16 · gin-gonic/gin

あまり重要なポイントではないかもしれませんが、 ルーティング用メソッドがGetPostじゃなくて、GETPOSTだというのも、気持ち悪いかもしれません。。

まとめ

将来的にginがどうなっていくのかは楽しみですが、現時点ではmartiniを使うのが、開発時には楽である気がします。

さらに、身も蓋もないことを書きますと、自分自身がそこまで高速であることが求められるようなプロジェクトに携われていません。

とはいえ、たとえばredisが数万クエリ/秒を捌けるのに比べてginは約1500リクエスト/秒、martiniは約300リクエスト/秒(railsとかnode.js級?)ですから、 WAFが高速化すると嬉しい部分はまだまだありそうです。

今後ginが高機能になった時点で、再度検討したいなと思います。

おまけ

日本でも最近はrebuild.fmに代表されるような開発者向けpodcastが増えてきましたが、 割りと古くからあるThe Changelogでも少し前にmartiniを取り上げ、 @codegangstaがゲストとして、なぜこういった実装になったか、その思想を語っています。

#117: Go, Martini and Gophercasts with Jeremy Saenz - The Changelog

あとは、どうしてそんなHNになったのかとか、どうでもいい話題もあって楽しめます。

そんなに話す速度も速くないし、割りと日本の英語教育でも学ぶような言い回しが多いので、 martiniが気になっている方は聴いてみると良いかもしれません。

© 2015 3100 - All code snippets on this site is licensed under a Creative Commons Attribution 3.0 Unported License.