今回のテーマは「ネット選挙」です。 2019年12月現在、日本ではオンラインでの選挙はまだ実現されていませんが、近い将来にネット選挙が実現し、そのアプリケーションをあなたが実装することになるかもしれません。大量の投票に耐えられるようにアプリケーションチューニングの練習をしておきましょう。 この選挙では1人1票ではなく、納税額によって各人投票できる票数が異なります。
/vote
から投票が可能です。例えば以下のユーザで投票ができます。
- 氏名:
ウスイ シュンロウ
- 住所:
宮崎県
- 私の番号:
67895586
- 候補者: 誰かを選択する
- 投票理由: 適当な文字列を記入する
- 投票数: 89 以下の数字 (このユーザは89票の投票権を持っています)
git clone git@github.com:keisuke2236/ISHOCON2.git
cd ISHOCON2
docker-compose up -d
こんな表示が出たら起動完了です。
Starting ishocon2_app_1 ... done
Starting ishocon2_bench_1 ... done
このコマンドでサーバに入れます。
docker exec -it ishocon2_app_1 /bin/bash
アクセスすると2つのファイルがあると思います、dataは基本使いません(ダンプデータが入ってるだけです)
- data
- webapp
webappの中から好きな言語を選択しましょう。
言語: Ruby, Python, Go, PHP, NodeJS, Crystal
言語を選んだら、このページの少し下にあるwebサーバの立ち上げ方一覧から選んだ言語の起動方法を探し実行してください。
アプリケーションを起動したら以下のURLで動作を確認できます。 httpsでしか見ることができないのでご注意ください
https://0.0.0.0/
webappディレクトリはdocker上にマウント済みです。 mac上で webapp ディレクトリを変更すればローカルサーバーの内容が変更されます。
デフォルトでマウントされているはずですが、されてない場合は各自で調整お願いします。
docker-compose.yml
の app
でローカルの webapp
ディレクトリをマウントすると、ローカルのファイル変更がdockerの中にもすぐに反映されるので便利です。
app:
volumes:
- ./webapp:/home/ishocon/webapp
ターミナルで以下のコマンド実行すると現在のスコアが表示されます。 変更後早くなったかどうかは確認しましょう。
docker exec -it ishocon2_bench_1 /bin/bash
./benchmark --ip app:443
各チームに1台インスタンスを用意してます。
PEMファイルとサーバー情報は各チームのプライベートチャンネルに貼ります。
チームで利用する言語を相談し、決定後設定を行いサーバーを起動してください。
ssh -i ~/.ssh/team_name_key.pem ubuntu@xxx.xxx.xxx.xxx
sudo su - ishocon
ls
data #DB初期化用のdump(後述)
webapp #最適化するアプリケーション
cd ~/webapp/ruby
unicorn -c unicorn_config.rb
cd ~/webapp/python
uwsgi --ini app.ini
cd ~/webapp/go
go get -t -d -v ./...
go build -o webapp *.go
./webapp
cd ~/webapp/php
cat README.md
cd ~/webapp/nodejs
npm install
node index.js
cd ~/webapp/crystal
shards install
crystal app.cr
動作確認URL、証明書エラーは無視してください。
1分間の負荷走行によりスコアを算出しますが、リクエストのパターンが途中で切り替わります。
/initialize
にアクセスしてデータを初期化します。(10秒以内にレスポンスを返す必要があります)- 期日前投票: 投票の結果が正しく結果表示ページに反映されていることを確認します。この間のリクエストはスコアには影響しません。
- 投票開始(45秒間): 投票が行われます。アプリケーションの高速化が十分でない場合、45秒を過ぎても数秒間投票が続くことがありますが、これはベンチマーカーの仕様です。
- 投票結果確認(15秒間): 投票結果の確認が行われます。投票時と同様に15秒を数秒過ぎてベンチマーカーが終わることがありますが、仕様です。
- スコアはベンチマーカーが1分間の負荷走行を行っている間にレスポンスが返された
成功レスポンス数(GET) x 2 + 成功レスポンス数(POST) x 1 - 失敗レスポンス数(200以外) x 100
により算出されます。 - 期日前投票にて、期待しないレスポンスが返ってきた場合にはその時点でベンチマーカーが停止し、スコアは表示されません。
- 投票が1度でも失敗(200でないレスポンス)するとその時点でベンチマーカーが停止し、スコアは表示されません。投票は必ず成功する必要があります。
- インスタンスを複数台用いることや、規定のインスタンスと別のタイプを使用すること。
- ブラウザからアクセスして目視した場合に、初期実装と異なること。
- 目視で違いが分からなければOKです。
- ベンチマーカーを改変すること。
- ISHOCONと検索すること
- DOMを変更する
- ベンチマーカーにバレなければDOMを変更してもOKです。
- 再起動に耐えられない
- インスタンスを再起動して、再起動前の状態を復元できる必要はありません。
- 汎用的な高速化手法を検索すること
3306 番ポートで MySQL(5.5) が起動しています。初期状態では以下のユーザが設定されています。
- ユーザ名: ishocon, パスワード: ishocon
- ユーザ名: root, パスワード: ishocon
Mysqlへのアクセスはこれでできます
mysql -u ishocon -pishocon ishocon2
3306 番ポートで MySQL(5.5) が起動しています。初期状態では以下のユーザが設定されています。
- ユーザ名: ishocon, パスワード: ishocon
- ユーザ名: root, パスワード: ishocon
初期データの挿入方法
mysql -u ishocon -pishocon ishocon2 < ./data/ishocon2.dump
"既存のMySQLを使う限りは"これを実行する必要はありません。