この記事は NTTコミュニケーションズ Advent Calendar 2019の1日目の記事です.
はじめに
大昔に1度投稿したきり,お久しぶりななおすけです.
気がついたら就職をして,とある会社でお世話になっています.
最近はESXiと戯れながらRubyを書く仕事をしています.
さて,本記事はN-ISUCONの運営を支えた技術について解説します.
これまで,社内ISUCONの問題公開はあっても,裏側の話はあまり見かけなかったので書いてみました.
N-ISUCONについて知りたい方はこちらの記事を参照ください.
N-ISUCONのアーキテクチャ
競技VMの構成
競技者には,リソースとして下図のようなGCE上のVM(競技VM)が3台提供されていました.
初期状態として,下記のソフトウェアがインストールされています.
- Apache HTTPD Server
- MySQL
- 問題実装の言語やそのライブラリ
- Python3
- Ruby
- NodeJS
- Golang
構成としてはシンプルなWebAppサーバですね.
ゴールデンイメージはAnsibleを使って構築,プロビジョニングはTerraformを使っています.
全体的なアーキテクチャ
N-ISUCON全体のアーキテクチャはこんなかんじです.
構成要素としては競技VM以外に下記のVMがあります.
- Portal (1台)
- 競技者向けのログイン情報やサーバIP情報の掲載,ベンチマークリクエストなど
- Sinatraを動かす程度なのでそこまで強くない
- Benchmark (複数台)
- 競技VMに対してベンチマークをかけるVM
- 割とコア数/メモリをマシマシにした強いインスタンス
それぞれのVMはCloudSQLとCloud Memorystoreのメッセージキューを使ってデータをやり取りしています.
また,ベンチマーク結果のスコアはFirebaseに投げ込み,ほぼリアルタイムにグラフ化をしました.
GCPに思い切り寄せて構築した理由として,今年度の新卒社員研修 のIaaSワークショップでの知見を活かしたためです.
技術的な運営は5人であったため,使える資産をうまく再利用しています.
App開発の流れ
PostmanとPythonによる先行実装
まず,Postman を使ってエンドポイントを確定しつつ,Pythonによる実装を行いました.
Postmanは,オンラインでテストが共有できるので便利でよかったです.
複数言語への対応
PostmanとPythonの実装が終わると,そのコードに基づいて複数言語への対応を行なっていきました1.
言語毎にディレクトリを切ってそれぞれのディレクトリ内で開発を進めています.
各言語でDockerfileを作り,docker-compose.yaml
を作っています.
これにより,簡単に開発アプリを立ち上げられるようになっています.
開発した機能については,docker-composeでアプリを立ち上げた後,Postmanを使ってテストを行なっています.
おおよそ通るのですが,稀によくPostmanのオンライン同期が壊れてしまうため,その他いろいろとまとめて直す羽目になったりもしました.
APIテストが通ると,PullReqとレビューを通してMergeされる仕組みになっています.
とあるプルリクのレビュー風景はこんな感じです.
おわりに
社内ISUCON "N-ISUCON" の運営/実装の裏側について簡単に紹介しました.
本当は問題公開もこのタイミングでしたかったのですが,間に合いませんでした. ゴメンネ2.
そんなわけで,明日は @iwashi86 さんの記事です.
N-ISUCONの話を引き続きしていただけると聞いています.
お楽しみに!