GithubHelp home page GithubHelp logo

isucon / isucon9-final Goto Github PK

View Code? Open in Web Editor NEW
39.0 39.0 42.0 48.82 MB

ISUCON9 本戦問題

License: MIT License

Dockerfile 0.20% Go 56.21% Makefile 0.23% JavaScript 1.16% HTML 0.07% Vue 7.70% Python 7.77% Shell 0.06% Ruby 7.68% PHP 10.68% Perl 8.23%

isucon9-final's Introduction

CAUTION: this project is open for only #isucon administrators

/webapp
/webapp/perl
/webapp/ruby
/webapp/nodejs

/tools
/tools/benchmark
/tools/domchecker
/tools/scoreboard

** Webアプリの基本方針
-処理はすべてリクエストを受け取ってから実施する
--DBへのクエリ
--テンプレートからのレンダリング
-全てのコンテンツをアプリケーションから渡す
--js/css/画像も含めて
-キャッシュ等はとりあえず全て無し

** 実装するリクエストハンドラ
- /
-- GET
-- articleのリスト(投稿順(id順) 最新10個)
--- SELECT id,title,body,created_at FROM article ORDER BY id DESC LIMIT 10

- /article/:articleid
-- GET
-- articleページの表示 (article + comments)
--- SELECT id,title,body,created_at FROM article WHERE id=?
--- SELECT name,body,created_at FROM comment WHERE article=? ORDER BY id

なお全ページ、左側のサイドバーに「新しいコメントがついた順に記事10件」を表示
--- SELECT article FROM comment GROUP BY article ORDER BY created_at DESC LIMIT 10

- /post
-- GET
-- 記事投稿用HTML ただしベンチ対象外のURLとする

- /post
-- POST
-- 記事投稿
-- パラメータはform形式で title, body
--- INSERT INTO article SET ...
-- レスポンスは / へのリダイレクト(成功)、もしくは適当なエラー用のHTTPステータス

- /comment/:articleid
-- POST
-- コメント投稿 (投稿フォームは /article/:articleid の末尾)
-- パラメータはform形式で name, body
--- INSERT INTO comment SET ...
-- レスポンスは /article/:articleid へのリダイレクト(成功)、もしくは適当なエラー用のHTTPステータス

** 添付するstaticファイル

- 画像
-- isuconロゴを適当なサイズにして流用、ページトップのバナー画像にする

- js
-- jquery 最新版の minify 済みファイル
-- jquery-ui 最新版の minify 済みファイル
-- isucon.js デザイン調整用

- css
-- jquery-ui の適当なスタイル用のもの一式
-- isucon.css デザイン調整用

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

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

  • Basic

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

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

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

    • WIP

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

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

datetime

PaymentInformationのdatetimeをISO8601型にする

列車検索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
		}
	}
]

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{

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

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

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

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

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

## 日付・時間・ スコア

\```
\```

## 言語

## 環境・PCスペック

## その他条件

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

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"}]}

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

ログ書き出し

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

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

bulk cancel

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

posttest

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

ユーザー周り

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

負荷を挙げる設定

以下について

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

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

APIエンドポイント表

  • /api/train/search

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

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

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

  • 列車一覧

列車空席情報APIの応答

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

入力

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

出力

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

FinalCheckにて、ISUCOIN売上計上

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

静的ファイルのPretest

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

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

予約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
}

いろいろなValidate

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

採点方法

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

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.