ぶていのログでぶログ

思い出したが吉日

#isucon 11にチーム大和田純愛組で参加してきた

ISUCON11@pyama86@osamtimizer と3人で参加した。 ベストスコアはリーダーボード上で15977。その後ポータル上で記録はされなくなたけど、@pyama86がRedisでのキャッシュを入れたのが反映されて16128になっていた。 f:id:buty4649:20210821214404p:plain

感想

12:00くらいにGET /api/trendのN+1をうまく解消できてスコアが一気に13645上がった! 事前に、ISUCON10の予選問題を復習しておいたので(私の中では)そこそこの早さで解決できてよかった(thx @pyama86!!)。 しかしその後、DBに含まれていたiconファイルをディスクに書き込みNginx側から配信するようにしたり、POST /api/condition/:jia_isu_uuidをSidekiqを使って非同期に書き込むようにしてみたもののスコアに結びつかず無念な結果に終わった…。

ルールにキャッシュの話があったので、キャッシュを有効に活用することでスコアが伸びると思っていたのだが、Sinatraにおいて動的ページにLast-Modifedヘッダなどをつける方法がわからなくて手が出せなかった。。。

Sinatra::Helpers#last_modified を使う

競技終了後にチーム内で振り返りをしているときに Sinatra::Helpers#last_modifiedというメソッドがあることを知った。 このメソッドを使うと、Last-Modifiedヘッダを返却できるようになる。 そして、 このメソッドを呼び出した時点でIf-Modifed-Sinceヘッダを評価して更新がなければ304を返す という処理になっていることを知った。。。

↓検証コード

require 'sinatra'
require 'date'

get '/' do
  last_modified(DateTime.parse("2021/08/21 18:54"))

  puts "200"
  "hello world"
end

実際に起動してみて動作確認してみる。

☆通常のリクエスト
❯ curl -svo /dev/null 'http://localhost:4567/'
- - snip - -
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK 👈 200を返している
< Last-Modified: Sat, 21 Aug 2021 18:54:00 GMT
- - snip - -

☆If-Modified-Sinceヘッダをつけてリクエスト
❯ curl -svo /dev/null 'http://localhost:4567/' -H 'If-Modified-Since: Sat, 21 Aug 2021 18:54:00 GMT' -H 'Cache-Control: max-age=0'
- - snip - -
< HTTP/1.1 304 Not Modified 👈 304を返している
< Last-Modified: Sat, 21 Aug 2021 18:54:00 GMT
- - snip - -

☆サーバ側で確認
❯ bundle exec ruby app.rb
[2021-08-21 21:56:52] INFO  WEBrick 1.7.0
[2021-08-21 21:56:52] INFO  ruby 3.0.2 (2021-07-07) [x86_64-linux]
== Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick
[2021-08-21 21:56:52] INFO  WEBrick::HTTPServer#start: pid=2585167 port=4567
200 👈 1回目のリクエストは通常の処理がされたので200と表示されている
127.0.0.1 - - [21/Aug/2021:21:56:56 +0900] "GET / HTTP/1.1" 200 11 0.0123
127.0.0.1 - - [21/Aug/2021:21:56:56 JST] "GET / HTTP/1.1" 200 11
- -> /
127.0.0.1 - - [21/Aug/2021:21:56:58 +0900] "GET / HTTP/1.1" 304 - 0.0015 👈 If-Modified-Sinceヘッダを処理しているので200と表示されず304を返している
127.0.0.1 - - [21/Aug/2021:21:56:58 JST] "GET / HTTP/1.1" 304 0
- -> /

これをつかえば、もっとうまくキャッシュコントロールできたなぁ・・・反省

また1つ賢くなった。