はじめに
この記事は アイスタイル Advent Calendar 2017 の 5 日目です。
@ytakeの投稿を期待されていた皆様申し訳ありません。
諸事情により本日はアイスタイルでサーバーサイドエンジニアとしてGo/Scalaなどで開発している @ginshari がお届けします。
TL;DR
- 社内のアプリケーションにGoを本格的に利用し始めてから2年がたちました
- REST-APIの開発用途やデータ移行バッチなど、幅広く使われています
- 会社でのGo勉強会も活発に行われるようになってきました
- 俺達の戦いはこれからだ!
この2年ちょっとの振り返り
- @ginshari が入社して2ヶ月、実はGoが少し使われていることを知る
- サービスに利用するちょっとしたREST-APIをGoで作成してみて、なし崩し的に本番リリース→稼働
- goji、echoと使っていったがgoaに出会ったのでgoaを使ってみる
- goa良かった・・・尊い・・・となったので2017年はずっとgoa
- 別部署でもGo導入の機運が高まったので社内勉強会の実施!
goaの導入
弊社では現在、複数の多様なサービスが互いに関わり合うことが多いため、他部署のシステムにAPIのインターフェースをレクチャーするタイミングがどの部署においてもかなりの頻度で発生しています。
そこで、
- メンテされないAPIドキュメントにならない(なりづらい)開発サイクル
- Swaggerで定型的に提供されるドキュメントとなるため、慣れが前提にはなりますが、読みやすい
という効果が得られることを期待して、goaを導入しています。
個人的な体感として、APIドキュメントのメンテコストはかなり削減されているように思いますし、Sampleのレスポンスも設計として定義した内容で示すことができるため、インターフェースの理解の齟齬が生まれにくくなってきているなという風には思っています。
2017年は、goa勉強会 in 六本木一丁目と題しまして、弊社にてgoaの勉強会イベントを行ったりもしました。機会があれば2018年も開催したいなと思っておりますので、ご興味のある皆様のご参加をお待ちしております。
アプリケーション配布など
弊社アイスタイルは、PHPのプロダクトの比率が多く、jenkinsを経由して自動デプロイツールを利用していることが多いのですが、コードベースの大きさや配布先サーバー数などの影響でデプロイに数分ではありますが時間がかかっていました。
Goを利用したアプリケーションに関しては以下のような工夫をしています
- go-bindata等を利用した静的ファイルの.goファイル化
- 実行ファイルを必ずバイナリ化して稼働させるサーバーに配布
- アプリケーションを動作させるサーバーでは、配布されたバイナリをsupervisordで複数プロセス起動させる
- そのため、アプリケーションはコマンドラインオプションなどでポート番号指定を行えるようにしておく
- nginxでポートごとに起動されたサーバーアプリケーションに対してupstreamを定義し、ロードバランサーが複数サーバーのnginxに対してリクエストを振り分ける
こうすることで、
- 配布の煩わしさを低減し、配布物をアプリケーションのバイナリ1つに絞ることによってデプロイ処理を簡素化
- スケールしたい場合にもバイナリを配布すればよくなるため、高負荷になった場合の対策も用意しやすい
といった良い結果を生むことができました。
※ 同一サーバーで2プロセス動作させるところは、もしかしたらGoのCPUの使い方的にあんまり意味が無いかもしれませんが、片方ずつ再起動させることで落ちないような状態にできているようにも思うのでこうしています。
社内Go勉強会について
まだまだ始めたばかりなので、どういう形が社内のメンバーに対してフィットするのかという部分で手探り状態で進めているのですが、
- go入門
- goa入門
- ポインターとレシーバについて
- インターフェースと委譲
- テストの始め方とテスト時に役立つツール
と言ったテーマで10月後半から、数回実施しています。
こちらについては、まだまだこれから知識自体の読み物や手を動かす時間などを増やせるようなコンテンツを増やしていくことでより良くしていければなと思います。
おわりに
ざっくりとではありますが、アイスタイルにおけるGoアプリケーション開発について解説させていただきましたが、いかがでしたでしょうか?
明日の弊社アドベントカレンダーでは、DBAの @sugat1679 が「MariaDBのストレージエンジンを駆使して目指せRDS - はじめの一歩」というテーマで投稿を行いますので、ぜひご覧いただければと思います!