Git Product home page Git Product logo

isucon9-final's Introduction

ISUCON9 本戦問題

ドキュメント

スペシャルサンクス

各言語移植

時間の無い中、移植にご協力いただき、誠にありがとうございます。

  • @ykzts 氏 (Ruby)
  • @kazeburo 氏 (Perl)
  • @shoma 氏 (PHP)

(GolangとPythonはさくらインターネット実装です。)

本番当日の動作環境

TBD

ローカルでのアプリケーションの起動

必要な環境

ウェブアプリケーションの起動方法

リポジトリをCloneし、

git clone [email protected]:chibiegg/isucon9-final.git
cd isucon9-final
(cd webapp/frontend && make)

実装言語を指定してBuildとUpをする。

export LANGUAGE=go
docker-compose -f webapp/docker-compose.yml -f webapp/docker-compose.${LANGUAGE}.yml build
docker-compose -f webapp/docker-compose.yml -f webapp/docker-compose.${LANGUAGE}.yml up

http://127.0.0.1:8080

ローカルでのベンチマーカーの起動

必要な環境

ベンチマーカーの起動方法

リポジトリをCloneして、ビルドを行う

git clone [email protected]:chibiegg/isucon9-final.git
cd isucon9-final
(cd bench && make)

ビルドされたバイナリは bench/bin/ 配下に配置されるため、ベンチマーカーのバイナリだけ起動する (bin/bench~~~)

(Mac の場合は バイナリ名のサフィックスに _darwin が、Linuxの場合はバイナリ名のサフィックスに _linux がつきます)

bench/bin/bench_darwin run --payment=<課金APIのアドレス> --target=<webappのアドレス> --assetdir=<フロントエンドのビルド結果が配置されたディレクトリ>
  • assetdirについて補足

    • assetdirは、ベンチマーカーがアプリケーションが正常動作しているかテストする際に用いられます
    • 当問題ではフロントエンドがVue.jsで実装されているため、webapp/frontend/dist を指定することになります
  • 出力が大変多いので、詳しく調査したい場合は teeコマンドなどでログに書き出すことをお勧めいたします

デプロイ

make archive
cd ansible
ansible-playbook -i hosts -u root -s -c paramiko -D playbook.yml

既知の問題

コンテスト開催中にも残っており、準備中に発覚しなかった問題。

  • 座席情報が誤っている #209

修正済み

  • Ruby実装で、データベースの環境変数参照が誤っていた #211

isucon9-final's People

Contributors

chibiegg avatar kazeburo avatar methane avatar misodengaku avatar notchi590 avatar shoma avatar tukejonny avatar ykzts avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

isucon9-final's Issues

posttest

  • 予約と決済の突き合わせ
  • 座席列挙APIの結果でちゃんと予約状態になっているか
  • ユーザの予約リストに間違いがないか
  • ログインがちゃんと行えるか

負荷を挙げる設定

以下について

  • 負荷を挙げる方法
  • 設定上、どういう経緯で負荷が上がるのかの説明

最初は繁忙期を設けるという話にしていたけど、設定では開業前なので、繁忙期をこの設定にねじ込むのは難しそう

採点方法

  • エンドポイントごと得点をふる (isucon8-finalなどと同様)
  • 予約の獲得数に応じて(獲得数に加え、グリーン席などの予約の場合は高くつけるとかもありだろうか)

pretest

pretest

  • ランダムなテストユーザを作成できるよう、ダミーデータ生成をする

  • 適当なクライアントを作成

    • トップページにアクセスできる
      • 登録できる
      • ログインできる
    • 固定値の初期データ件数をチェック

予約できないはずの予約でクリティカルエラーになってない

2019-10-04T00:59:41.266+0900	warn	isutrain-benchmarker	予約できないはず	{"departure": "根左海岸", "arrival": "維荻学園", "date": "2020-01-02T09:58:03+09:00", "train_class": "遅いやつ", "train_name": "37", "car_num": 9, "seats": [{"row":1,"column":"A","class":"premium"},{"row":1,"column":"B","class":"premium"}]}

このようなエラーが出るとクリティカルエラーのはずなのに、問題なくベンチが終了してしまい、何も減点されない。

ベンチマークスコア記録用issue

ベンチマークでよいスコアがでましたら、このissueにコメントして残していただけると嬉しいです。

ローカル環境でのアプリケーション・ベンチマーカーの起動方法はこちら
ローカルでのアプリケーションの起動方法
ローカルでのベンチマーカーの起動方法

## 日付・時間・ スコア

\```
\```

## 言語

## 環境・PCスペック

## その他条件

※ 環境・PCスペックに関しては、OS情報の簡易なサマリ、コア数、メモリ容量が分かれば他の方法でも大丈夫です

assets/testdataを作成する方法がわからない

手元の環境で再現しようとしていますが、一通り手順をなぞってみたもののassets/testdataが生成されずbenchを実行できません。どこかでダウンロードできたりするんでしょうか。

列車空席情報APIの応答

特定の列車、特定の車両を指定して、個別の席の空席情報を返す

入力

  • 日付
  • 列車種別
  • 列車番号
  • 乗車駅
  • 降車駅
  • 号車

出力

その号車、その乗車区間での、全座席の空席状態

ログ書き出し

ベンチマーカーのログ書き出しは

warn相当であればstderrに出すけど、そうでないinfo相当はstdoutに書き出す

ベンチマーカーのシナリオ

  • Basic

    • 登録 -> ログイン -> 列車検索 -> 座席列挙 -> 予約 -> 予約の確定
    • ログイン -> 〃
  • Cancel

    • 予約したりキャンセルしたりを繰り返して、最後には確定させるユーザ
    • 1ユーザで複数の予約を取るケースを加味
    • 登録 -> ログイン -> 列車検索 -> 座席列挙 -> 予約 -> 予約キャンセル -> 予約の確定
    • ログイン -> 〃
  • Search

    • やたら検索かけてくる
    • 登録 -> ログイン -> 列車検索 (検索条件を複雑化、負荷が上がるような条件など)
    • ログイン -> 〃
  • 繁忙期の差し込み方

    • WIP

予約API応答メモ

内容は仮なので好きにいじってください

request

2020年1月1日 のぞみ99号の4号車1番E席を取る場合

dateは要検討

{
    "date": "2020-01-01T08:00:00+09:00", 
    "train_class": "のぞみ",
    "train_name": "99号",
    "car_num": 4,
    "origin": "東京",
    "destination": "大阪",
    "seats": [
        {
            "row": 1,
            "column": "E"
        }
    ]
}

response

{
    "reservation_id": "123567890", 
    "あああああ": true
}

datetime

PaymentInformationのdatetimeをISO8601型にする

bulk cancel

バルクでキャンセルするやつ実装する

いろいろなValidate

  • クレカ非保持化API
    • CVV文字数(数字3文字)
    • クレカ番号(数字8文字/本物が登録できないように桁数を調整している)
    • 有効期限MM/YY(未来の期限だけ登録できるようにする)

APIエンドポイント表

  • /api/train/search

    • 列車の検索
    • 乗る日時と乗る駅降りる駅をPOSTすると条件に合う列車が返される
    • #24
  • /api/train/seats

    • 席表
    • 列車種別と列車番号、号車番号投げると席マップ列挙して返す
    • #26
  • POST /api/train/reservation

    • 予約
    • 列車、日付、座席を指定して席を確保し、決済を行う
    • #35
  • 駅一覧

  • 列車一覧

列車検索APIの応答内容メモ

  • /api/train/search

  • 列車種別

  • 列車番号

  • 始発駅 (なくてもいいかも?)

  • 終点駅 (なくてもいいかも?)

  • 乗る駅

  • 降りる駅

  • 発時刻

  • 着時刻

  • 乗車区間での空席情報 (○△×)

    • グリーン
    • グリーン (喫煙所付近)
    • 指定席
    • 指定席 (喫煙所付近)
  • 乗車区間での料金

    • グリーン
    • グリーン (喫煙所付近)
    • 指定席
    • 指定席 (喫煙所付近)
[{
		"train_class": "最速",
		"train_name": "1",
		"start": "東京",
		"last": "名古屋",
		"departure": "東京",
		"destination": "名古屋",
		"departure_time": "2019-09-07T15:57:56.320388422+09:00",
		"arrival_time": "2019-09-07T15:57:56.320388668+09:00",
		"seat_availability": {
			"non_reserved": "",
			"premium": "",
			"premium_smoke": "×",
			"reserved": "",
			"reserved_smoke": ""
		},
		"seat_fare": {
			"non_reserved": 0,
			"premium": 180000,
			"premium_smoke": 0,
			"reserved": 112500,
			"reserved_smoke": 0
		}
	},
	{
		"train_class": "遅いやつ",
		"train_name": "3",
		"start": "東京",
		"last": "大阪",
		"departure": "東京",
		"destination": "名古屋",
		"departure_time": "2019-09-07T15:57:56.333610242+09:00",
		"arrival_time": "2019-09-07T15:57:56.333610516+09:00",
		"seat_availability": {
			"non_reserved": "",
			"premium": "",
			"premium_smoke": "×",
			"reserved": "",
			"reserved_smoke": ""
		},
		"seat_fare": {
			"non_reserved": 0,
			"premium": 96000,
			"premium_smoke": 0,
			"reserved": 60000,
			"reserved_smoke": 0
		}
	}
]

FinalCheckにて、ISUCOIN売上計上

PosttestをFinalCheckに名称変更しました (当該フェーズではバリデーションではなく、ISUCOIN計上を行なってスコア算出するだけなので)

静的ファイルのPretest

静的ファイルのハッシュ値を用いて、参加者が変更を加えていないかベンチマーカーでチェックを行う

  • ベンチマーカーデプロイ先に、静的ファイルも一緒にデプロイし、それをベンチマーカーが読み取る方式にする?
  • チェックが必要そうなファイルの整理

ユーザー周り

  • ユーザー登録
  • ログイン
  • ログアウト
  • マイページ
    • 予約リスト
    • 予約詳細
    • キャンセル

train_timetable_master のデータに関して

こんにちは。
ISUCON9決勝データで練習しているときに気づいたのですが、
train_timetable_masterに不整合なデータが多く有るのではないかと思いました。

例えば、こちらの train_master
https://raw.githubusercontent.com/isucon/isucon9-final/master/webapp/sql/90_train.sql

("2020-01-01","遅いやつ",2,"06:00:00","京都","東京","1"),

は遅いやつ2号 京都発東京行き(上り)というデータだと思われますが、それに対応していると思われる
train_timetable_master では 遅いやつ2号 東京 06:03:56発京都10:55:16着 と読めます。

https://raw.githubusercontent.com/isucon/isucon9-final/master/webapp/sql/94_0_train_timetable.sql

("2020-01-01","遅いやつ","2","東京","06:00:00","06:03:56"),
....
("2020-01-01","遅いやつ","2","京都","10:55:16","10:58:01"),

つまり進行方向逆のデータになっていると思われます。

ベンチマークに関しても 「大阪」→「東京」の最速で検索するテストケースのようですが

wantDepartedAt: map[string]string{

期待するデータは到着時間が逆転しています。

バグが有っても初期実装の仕様そのままチューニングするというゲームかも知れませんが、さすが苦しいかなと思いましたので報告します。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.