参加者の皆さん、 ISUCON4 予選、お疲れ様でした。
ISUCON4 運営チームの @rosylilly です。
すでに予選問題の解説記事もあがっていますが、この記事では、ベンチマーカー実装者が予選参加者となるべく同じ状況で、出来る限り高得点を出すことを重点に置いたピーキーな解答例について解説します。
※ 別解となる、この記事ほどピーキーではない @sorah による解答記事はこちらです。
また、実装されたソースコードは GitHub にて公開しています。
前提
- 実装時間は皆さんとおなじ8時間程度を想定しています
- この実装はすべて僕一人で行います
- 架空の想定として、運営チーム(@mirakui, @sorah, @rosylilly)で予選に参加している状況としています
- @mirakui と @sorah がまったく別の実装を行っている設定です(去年の予選と同じ状況)
- 僕は出題者であり、ベンチマーカー実装者
- 問題を把握する時間などはほぼスキップできる
- すでにどういう解法にするかある程度検討がついている
手始めに(2分)
僕の手元で EC2 インスタンスを立ち上げて真っ先にやることは
sudo service nginx stopsudo service mysqld stopsudo chkconfig nginx offsudo chkconfig mysqld off
で Nginx と MySQL を停止させます。
Nginx 及び MySQL を停止させるのは、この2つに一切依存しない実装をする、と最初から決めているためです。この2つはおそらく並行作業中の @mirakui と @sorah が触っているはずなので、僕の時間内にうまくいくかどうかわからないギャンブル実装に合わせていれた変更による手戻りや、設定のコンフリクトなど、想定されうる諸問題を最初から発生させないように、僕の実装からは完全に除外するためにサービスの停止を行います。
実装方針
まずは、実装方針を固めます。実装方針はおおまかに3点。以下のように定めました。
- 他のミドルウェアに依存しない
- Redis であれ、 Memcached であれ、2人が使っていそうなので依存しません
- これはベンチマーク対象をスイッチした時に事故を起こさないための措置です
- 最終的な AMI 作成時に事故を起こすと失格になってしまいかねません
- Go 言語で実装するが、参考実装のフォークは行わず、フルスクラッチで書く
- Martini が入っていて便利そうなのはいいのですが、最終的にどこがボトルネックになるのかわからない以上、型による制約が多く、人の手の入った状況から書き換え難い Go ではベース実装が足かせになると踏んでの判断です

