Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

N-ISUCONを支えた技術

More than 1 year has passed since last update.

この記事は NTTコミュニケーションズ Advent Calendar 2019の1日目の記事です.

はじめに

大昔に1度投稿したきり,お久しぶりななおすけです.
気がついたら就職をして,とある会社でお世話になっています.
最近はESXiと戯れながらRubyを書く仕事をしています.

さて,本記事はN-ISUCONの運営を支えた技術について解説します.
これまで,社内ISUCONの問題公開はあっても,裏側の話はあまり見かけなかったので書いてみました.

N-ISUCONについて知りたい方はこちらの記事を参照ください.

N-ISUCONのアーキテクチャ

競技VMの構成

競技者には,リソースとして下図のようなGCE上のVM(競技VM)が3台提供されていました.
image.png
初期状態として,下記のソフトウェアがインストールされています.

  • Apache HTTPD Server
  • MySQL
  • 問題実装の言語やそのライブラリ
    • Python3
    • Ruby
    • NodeJS
    • Golang

構成としてはシンプルなWebAppサーバですね.
ゴールデンイメージはAnsibleを使って構築,プロビジョニングはTerraformを使っています.

全体的なアーキテクチャ

N-ISUCON全体のアーキテクチャはこんなかんじです.

image.png

構成要素としては競技VM以外に下記のVMがあります.

  • Portal (1台)
    • 競技者向けのログイン情報やサーバIP情報の掲載,ベンチマークリクエストなど
    • Sinatraを動かす程度なのでそこまで強くない
  • Benchmark (複数台)
    • 競技VMに対してベンチマークをかけるVM
    • 割とコア数/メモリをマシマシにした強いインスタンス

それぞれのVMはCloudSQLとCloud Memorystoreのメッセージキューを使ってデータをやり取りしています.
また,ベンチマーク結果のスコアはFirebaseに投げ込み,ほぼリアルタイムにグラフ化をしました.

GCPに思い切り寄せて構築した理由として,今年度の新卒社員研修 のIaaSワークショップでの知見を活かしたためです.
技術的な運営は5人であったため,使える資産をうまく再利用しています.

App開発の流れ

PostmanとPythonによる先行実装

まず,Postman を使ってエンドポイントを確定しつつ,Pythonによる実装を行いました.

Postmanは,オンラインでテストが共有できるので便利でよかったです.
postman

複数言語への対応

PostmanとPythonの実装が終わると,そのコードに基づいて複数言語への対応を行なっていきました1

ディレクトリ階層はこんなかんじ.
resize.png

言語毎にディレクトリを切ってそれぞれのディレクトリ内で開発を進めています.
各言語でDockerfileを作り,docker-compose.yaml を作っています.
これにより,簡単に開発アプリを立ち上げられるようになっています.

開発した機能については,docker-composeでアプリを立ち上げた後,Postmanを使ってテストを行なっています.
おおよそ通るのですが,稀によくPostmanのオンライン同期が壊れてしまうため,その他いろいろとまとめて直す羽目になったりもしました.

APIテストが通ると,PullReqとレビューを通してMergeされる仕組みになっています.
とあるプルリクのレビュー風景はこんな感じです.
image.png

おわりに

社内ISUCON "N-ISUCON" の運営/実装の裏側について簡単に紹介しました.
本当は問題公開もこのタイミングでしたかったのですが,間に合いませんでした. ゴメンネ2

そんなわけで,明日は @iwashi86 さんの記事です.
N-ISUCONの話を引き続きしていただけると聞いています.
お楽しみに!


  1. Pythonのバグに気づかず,全言語に同じバグが入ってしまういい話があったりもしました. 

  2. 障害対応で急遽夜勤が入ってしまった 

naosuke2dx
とあるクラウドサービスの中の人.Rubyを書いたりAnsibleを書いたり,たまに物理筐体と仲良くしています.
http://blog.naosuke.me
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away