ISUCON9予選、2日目5位で通過しました

y_matsuwitter
Sep 9 · 3 min read
  • インクリメンタルなID採番についてはredisのincrコマンドを活用。
  • フラグの状態を整理し、transaction_evidences + shippingsの存在有無とそのフラグ関係を整理すればitemsテーブルの確認をある程度スキップできる箇所があると分かったため、全力でクエリを排除。
  • 上記の結果でpostShip, postDone, postCompleteについては、MySQL叩かず返せるようにした。
  • usersのnum_sell_itemsとlast_bumpもRedisにそれぞれ別なキー構成で記録するように変更。
  • redisの初期データはMySQLの初期データをtsvでdumpしておき、それをgoで読んでredisに投入する動作をPOST /initializeで実装。
  • 最終的にdbx.MustBegin()を3箇所以外削除。またその中身でもできる限りクエリを排除。
  • トランザクション中に存在した外部APIリクエストをsync.WaitGroupとGoroutineでいい感じに並列化。
  • (2019/09/10追記)GET /users/transactions.jsonの外部APIリクエストを削除し、Redis上のshippings.statusに相当するフラグを利用するように変更。

    y_matsuwitter

    Written by

    正座エンジニア。DMM CTO, GunosyおよびLayerX Technical Advisor。早く電脳化させてください。ここには雑に考えた個人的な諸々を投げ込む。

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade