Voicy Tech Blog

Voicy公式Techブログ

VoicyがGoLangとEchoを採択した理由。

Voicy社 ITO 伊東です。

現在iPhoneアプリを提供しているVoicyですが、WEB版を鋭意製作中であります。
これまではネイティブアプリ開発用の環境を構築しておりましたが、Webに最適化または双方で使うために環境を構築し直す必要が出てきました。

そこで、今回は環境を構築し直すにあたっての言語とフレームワークの選定についてお話します。

結構いろんな言語と比較したんですが、結果的には GoLang × Echoを採択しました。

言語選定の前提となるミッション

今回はAPIを作るのに適した環境を作るという事が一番重要なミッション。
いわゆるマイクロサービスというやつですね。小さい単位でサービスを作ってAPIを通して各機能を呼び出すということ。そうすることで

  • 開発チームがサービスごとに分かれて、得意な言語を利用して各サービスの開発を進めることができる
  • 変更をかけたいときは、システム全体ではなく、その小さなサービスごとに変更をかけられる
  • 小さなサービスで開発単位を進めるため、ビルドやテストの期間が短くなり開発効率が上がる
  • モノリシックなシステムだと何か障害が起きたときに、どこがおかしいのかルート構造をたどるのに時間がかかるが、原因の突き止めが比較的容易

つまり、用途・目的ごとに小さな(マイクロな)サービスを作っておくことで、「変化に強くて柔軟性の高い、アプリケーション開発を行おう」というのがマイクロサービスなのです。

引用元 https://www.salesforce.com/jp/blog/2016/03/microservices.html

はい、僕の言いたいことを全ていい切ってくれてますね(しろめ
コレガヤリタイカラゲンゴカエルンダ、コジンテキナスキルアップデハナインダ・・・

最適な言語はなんなのか?比べてみた

APIを作るのに適した環境を作るというのを念頭に比較してますが、個人の主観も大きく入っておりますのでその点ご了承くださいませ(しろめ

・Java8 & Lagom

Ruby & Rails

PHP & Lumen

・Python3 & Nameko

GoLang & Echo

を検討致しました。
個人的にはRoRが好きです。
今回はORマッパーを使わない想定です(ふるえ
※別に嫌いではないですがAPIという事で1ミリ秒でも早くレスポンスを返したいという事を優先しております。

Java8 & Lagom

速度    ◎
開発効率  △
API化 ◯
採用    ☓

Java8で以前マイクロサービスを開発をしたことがありまして、結構簡単に出来ましたね。(もともとJava使いだからですが)個人的な主観でいってしまいますが 、
選択したくない(キリ
なぜなら別の言語にチャレンジしたいから(しろめ

RubyOnRails

速度    △
開発効率  ◎
API化  △
採用    ◯

Railsはとても好きなフレームワークで ルーティングも簡単に制御できますし、開発効率も高いです。 Viewを使わずActiveRecordのORマッパーも使わないという事ですと、Railsを採用する意味が大きく損なわれてしまいましたね・・

PHP & Lumen

速度    △
開発効率  ◎
API化    ◯
採用    △

LumenはLaravelのマイクロフレームワーク版で同じIlluminateコンポーネントを使用しております。 ルーティング処理もとても評判が良く、とても悩みました。 PHP自体は使えるエンジニアもとても多く、CakeやLaravel等も開発効率が高くサービスリリースを行う上でとても強い武器になると思います。
が、実行速度が遅い(スクリプト言語に求めるなという話ですけどね)事から却下。

Python3 & Nameko

速度    △
開発効率  ◯
API化 ◯
採用    ◯

Python結構いい感じですね、APIを構築するのにとてもあっている気がしますし、永続処理や非同期処理も様々なツールを合わせることで上手く対応できますね。音声ビッグデータ解析等いろいろ行う予定であるVoicyにとってパイソンは通らなくてはならない道ではあります。適材適所の言語を使用すれば良いと私自身は考えますので、その時にパイソンを選択すれば良いかと思います。

GoLang & Echo

速度    ◯
開発効率  ◯
API化  ◯
採用    ◯

GoLang使いました。 APIを作るために存在しているようなくらい簡単に出来てしまいますね。 継承が出来ないので(無理無理できないことはないけど・・・) コーディングするときに少し戸惑いはありますが ルーティング簡単、APIつくるの簡単(というか、それ以外無理ですねこれ)という形でしょうか。

優勝 GoLang

個人的な権限を行使して、面白そうなGoLangに決めました。

GoLang用のフレームワークの選定(すでにEchoとか書いてしまっておりますが・・)

  • Gin
  • Iris
  • Echo の3つを検討致しました。

結論からいうと、Echoを採用致しました。

フレームワークの実行速度で比較

Gin  734
Echo 879
Kami 1237
Goji   1299
Bone 1463
http   1854
Gocraft 1915
Gorilla 3944
Martini 5823
ns/op

参考記事
http://qiita.com/najeira/items/bdc988c4e93b3b5ccf2f

個人的にはGinかEchoの2択に絞られました。

書きやすさで比較

今回はAPIを作るのに適した環境を作るという事を一番の念頭に入れてはおりましたので、その点でどのフレームワークが書きやすそうかという事を考えました。

参考記事
http://blog.iktakahiro.sh/entry/2016/12/10/090000

http://qiita.com/keika299/items/62e806ae42828bb3567a

実際に書いて動作させてみましたがルーティングがとても簡単。

    // ルーティング
    e.Get("/hello", handle.MainPage())
    e.Post("/hello", handle.MainPage())

これで事が足りてしまいます。

まとめ:GoLangAPI作るならEchoが良さそう!

Go自体並列処理が行うのが得意なので、色々とめんどうな処理もは早く処理できそうですし。

Pythonも最後まで捨てがたかったのですが

  1. 学習コスト
  2. 採用
  3. 実行速度(コンパイルする分早いのは当たり前ですけどね)
    (4.個人の趣味)

でしょうか。
RoRからGolangに移行するひとが結構知り合いにも居ましたが気落ちが大分わかりました。