なまえは まだ ない

思いついたことをアウトプットします

ISUCON14延長戦の記録⑧ インメモリキャッシュに手を出す(その2)

ISUCON14の延長戦をやってます

以下の記事の続きです。

furusax0621.hatenablog.com

前回は通知エンドポイントのひとつである、椅子の通知エンドポイントを高速化しました。 今回はもうひとつの通知エンドポイントにインメモリキャッシュを導入します。

なお、最終的なコードは以下のリポジトリで公開しています。

github.com

ユーザーの通知エンドポイントレスポンスをキャッシュする

前回と同様、レスポンスで返す情報のキャッシュを試みます。 このエンドポイントではユーザーがリクエストしているライドの情報、ライドに割り当てられた椅子の情報などを返しています。 椅子の情報をキャッシュしていくのは少し骨が折れそうだったので、ライドの情報に限定してキャッシュしてみました。

完全な差分は以下のPull Requestのとおりです。

github.com

実装に関してはほぼほぼ前回の修正と同様です。効果が大きかった変更も同様で、ライドをリクエストしてないユーザーへのレスポンスを高速に返せるようになりました。

// キャッシュからライド情報を取得
rideMapByUserIDMutex.RLock()
rideFromMap, ok := rideMapByUserID[user.ID]
rideMapByUserIDMutex.RUnlock()

if !ok {
    writeJSON(w, http.StatusOK, &appGetNotificationResponse{
        RetryAfterMs: 30,
    })
    return
}

https://github.com/furusax0621/isucon14-extend/blob/eda0047d9d96b8f1968eff0546d533f8a63cfe12/webapp/go/app_handlers.go#L670-L680

まとめ・次回予告

前回に引き続き、通知エンドポイントのレスポンスをキャッシュすることで高速化を試みました。 ベンチマークの結果はおよそ43,000点!本戦終了時のスコア換算だと6位相当です!すごい、うおおお!

いよいよネタが尽きてきた……が、ユーザーの通知エンドポイントを眺めていたら気になる箇所が出てきました。次回はそこの改善に取り組みます。つづく。