From 960bb24be81b470b29401fa2d5e3e4b22c0e7037 Mon Sep 17 00:00:00 2001 From: wtks <30363887+wtks@users.noreply.github.com> Date: Sun, 8 Dec 2024 01:05:20 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bench/benchmarker/scenario/prevalidation.go | 2 -- bench/benchmarker/world/db.go | 29 +++++++-------------- bench/benchmarker/world/region.go | 1 - bench/benchmarker/world/request.go | 1 - bench/benchmarker/world/user.go | 1 - docs/ISURIDE.md | 4 ++- webapp/payment_mock/openapi.yaml | 2 +- 7 files changed, 14 insertions(+), 26 deletions(-) diff --git a/bench/benchmarker/scenario/prevalidation.go b/bench/benchmarker/scenario/prevalidation.go index 6f1672af..7c9527b7 100644 --- a/bench/benchmarker/scenario/prevalidation.go +++ b/bench/benchmarker/scenario/prevalidation.go @@ -288,8 +288,6 @@ func validateSuccessFlow(ctx context.Context, clientConfig webapp.ClientConfig) requestID = result.RideID } - // TODO: 登録された直後の椅子の状態を確認する - // GET /api/app/notifications { for result, err := range userClient.AppGetNotification(ctx) { diff --git a/bench/benchmarker/world/db.go b/bench/benchmarker/world/db.go index 29dc49bc..96c31537 100644 --- a/bench/benchmarker/world/db.go +++ b/bench/benchmarker/world/db.go @@ -9,12 +9,14 @@ import ( type RequestDB struct { counter int m map[RequestID]*Request + m2 map[string]*Request lock sync.RWMutex } func NewRequestDB() *RequestDB { return &RequestDB{ - m: make(map[RequestID]*Request), + m: map[RequestID]*Request{}, + m2: map[string]*Request{}, } } @@ -25,6 +27,7 @@ func (db *RequestDB) Create(req *Request) *Request { db.counter++ req.ID = RequestID(db.counter) db.m[req.ID] = req + db.m2[req.ServerID] = req return req } @@ -37,14 +40,7 @@ func (db *RequestDB) Get(id RequestID) *Request { func (db *RequestDB) GetByServerID(serverID string) *Request { db.lock.RLock() defer db.lock.RUnlock() - - // TODO ハッシュマップで持って引くように - for _, req := range db.m { - if req.ServerID == serverID { - return req - } - } - return nil + return db.m2[serverID] } func (db *RequestDB) Iter() iter.Seq2[RequestID, *Request] { @@ -89,12 +85,14 @@ type DBEntry[K ~int] interface { type GenericDB[K ~int, V DBEntry[K]] struct { counter int m map[K]V + m2 map[string]V lock sync.RWMutex } func NewGenericDB[K ~int, V DBEntry[K]]() *GenericDB[K, V] { return &GenericDB[K, V]{ - m: map[K]V{}, + m: map[K]V{}, + m2: map[string]V{}, } } @@ -105,6 +103,7 @@ func (db *GenericDB[K, V]) Create(v V) V { db.counter++ v.SetID(K(db.counter)) db.m[K(db.counter)] = v + db.m2[v.GetServerID()] = v return v } @@ -115,17 +114,9 @@ func (db *GenericDB[K, V]) Get(id K) V { } func (db *GenericDB[K, V]) GetByServerID(serverID string) V { - var zero V db.lock.RLock() defer db.lock.RUnlock() - - // TODO ハッシュマップで持って引くように - for _, req := range db.m { - if req.GetServerID() == serverID { - return req - } - } - return zero + return db.m2[serverID] } func (db *GenericDB[K, V]) Iter() iter.Seq2[K, V] { diff --git a/bench/benchmarker/world/region.go b/bench/benchmarker/world/region.go index ed4e51cc..ddea13ee 100644 --- a/bench/benchmarker/world/region.go +++ b/bench/benchmarker/world/region.go @@ -58,7 +58,6 @@ func (r *Region) RangeY() (bottom, top int) { // UserSatisfactionScore 地域内のユーザーの満足度 func (r *Region) UserSatisfactionScore() int { - // TODO: 検討 // 地域内の全ユーザーの平均評価の平均値を地域のユーザー満足度にしている // (ユーザーの評価の初期値は0) return int(math.Round(float64(r.TotalEvaluation.Load()) / float64(r.UsersDB.Len()))) diff --git a/bench/benchmarker/world/request.go b/bench/benchmarker/world/request.go index f75d6ef6..af27325e 100644 --- a/bench/benchmarker/world/request.go +++ b/bench/benchmarker/world/request.go @@ -132,7 +132,6 @@ func (r *Request) CalculateEvaluation() Evaluation { panic("計算に必要な時間情報が足りていない状況なのに評価値を計算しようとしている") } - // TODO: いい感じにする result := Evaluation{} { // マッチング待ち時間評価 diff --git a/bench/benchmarker/world/user.go b/bench/benchmarker/world/user.go index 781f21cf..945f8db9 100644 --- a/bench/benchmarker/world/user.go +++ b/bench/benchmarker/world/user.go @@ -233,7 +233,6 @@ func (u *User) Tick(ctx *Context) error { } // リクエストを作成する - // TODO 作成する条件・頻度 err = u.CreateRequest(ctx) if err != nil { return err diff --git a/docs/ISURIDE.md b/docs/ISURIDE.md index 7545abce..c15a2df5 100644 --- a/docs/ISURIDE.md +++ b/docs/ISURIDE.md @@ -160,12 +160,14 @@ data: {"ride_id":"01JEG4X2TZSE169T99XERS990M","user":{"id":"01JEG4W4E1QF0ZA1YY4B 1. `/home/isucon/env.sh` を編集し、`ISUCON_MATCHING_INTERVAL` の値を変更します。 2. `sudo systemctl restart isuride-matcher.service` でサービスを再起動します。 +なお、`GET /api/internal/matching`はインターネットには公開されず、ISURIDE 内部で利用される想定のエンドポイントであるため、自由に利用方法及び仕様を変更して構いません。 + ## 決済マイクロサービス ISURIDEを利用して目的地に到着した際、ユーザーは椅子の利用料金を支払う必要があります。 この支払い処理は社内の決済マイクロサービスを使用していますが、現在そのインフラが不安定なためリクエストが集中すると決済処理の途中でサーバーからのレスポンスが失われる可能性があります。 そのためリファレンス実装ではリクエストが失敗した場合は支払履歴を確認し、支払処理が完了していないことを確認した場合にはリクエストをリトライする実装となっています。 ただし既に支払い処理が開始されている場合、後述する`Idempotency-Key`ヘッダを使用せずにリトライを行うと、複数回の支払いが発生しエラーとなります。 - +決済マイクロサービスのAPIの詳細については`/home/isucon/webapp/payment_mock/openapi.yaml`を参照してください。 ### Idempotency-Key ヘッダを利用したリクエストの重複防止 決済マイクロサービスでは、`Idempotency-Key`ヘッダを利用して決済の重複を防ぐことができます。 diff --git a/webapp/payment_mock/openapi.yaml b/webapp/payment_mock/openapi.yaml index 280cde6e..f10deb6c 100644 --- a/webapp/payment_mock/openapi.yaml +++ b/webapp/payment_mock/openapi.yaml @@ -6,7 +6,7 @@ servers: - url: "http://localhost:8081/" description: api paths: - /payment: + /payments: post: summary: 決済を行う description: ""