All Articles

isucon に向けて新しくやってみていること

プロダクトマネージャの仕事は一旦おやすみ。
今回は明後日に控えている isucon に向けてやっていることを書いておく

isucon に役立ちそうな実装をためておける playground を作っている。

モチベーションは、isucon の予選問題や本選問題のローカル環境構築が面倒だったから。build が落ちたり(直せる範囲)ベンチマーカーがエラーになる原因を探っていると時間が溶けてしまう。1年に一回ローカル環境を構築しているが、結局やりたいのは NewRelic でモニタリングできるんだっけということ。そのためにベンチマークを回す必要はない。ましてや時間をかける必要はない。特に過去の問題はもうメンテされてないのでビルドで落ちる確率が高い。
不毛なことに気づいたので、今年からは自分の sandbox として isucon playground を作っておくことにした。このリポジトリで isucon に必要そうなミドルウェアを簡単にプログラムから扱えるようにし、カンニングコード的に使っていきたい。今のところ追加しているのは mysql / postgres / redis / nginx を適当に version ごとに定義できるようにしてある。以下の docker-compose 参照。

version: '3'
services:
  redis:
    image: "redis:7.2"
    ports:
      - "6379:6379"
  
  mysql57:
    image: "mysql:5.7"
    ports:
      - "12306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: isucon
      MYSQL_USER: isucon
      MYSQL_PASSWORD: isucon
    volumes:
      - ./mysql/5.7/data:/var/lib/mysql

  mysql80:
    image: "mysql:8.0"
    ports:
      - "12307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: isucon
      MYSQL_USER: isucon
      MYSQL_PASSWORD: isucon
    volumes:
      - ./mysql/8.0/data:/var/lib/mysql

  mysql82:
    image: "mysql:8.2"
    ports:
      - "12308:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: isucon
      MYSQL_USER: isucon
      MYSQL_PASSWORD: isucon
    volumes:
      - ./mysql/8.2/data:/var/lib/mysql
  
  postgresql16:
    image: "postgres:16"
    ports:
      - "14432:5432"
    environment:
      POSTGRES_USER: isucon
      POSTGRES_PASSWORD: isucon
      POSTGRES_DB: isucon
    volumes:
      - ./postgres/16/data:/var/lib/postgresql/data

  postgresql15:
    image: "postgres:15"
    ports:
      - "14433:5432"
    environment:
      POSTGRES_USER: isucon
      POSTGRES_PASSWORD: isucon
      POSTGRES_DB: isucon
    volumes:
      - ./postgres/15/data:/var/lib/postgresql/data

  go-app01:
    image: "golang:1.21"
    build:
      context: .
      dockerfile: ./go/app01/Dockerfile
    ports:
      - "11180:8080"
    volumes:
      - ./go/app01:/app  # ローカルファイルをコンテナにマウント

  nginx:
    image: "nginx:1.25"
    ports:
      - "11190:80"
    volumes:
      - ./nginx/1.25/nginx.conf:/etc/nginx/nginx.conf:ro  # Nginxの設定ファイルをマウント
      - ./nginx/1.25/src:/usr/src:ro  

例えば、mysql は 5.7 / 8.0 / 8.2 が立つ。8.0 と 8.2 でそこまで差分はないだろうけど何か試したいことがあるかなと思って追加してみた。
go のコードは hot reload を入れてある。

育てていきたいこと

  • Nginx でいろんな配信パターンを試してみる
  • MongoDB を触るサンプルを追加すること
  • Redis を触るサンプルを追加すること
  • k6s などで負荷をかけられるようにすること
  • NewRelic の設定を Go App 側に入れてみること
  • 大量データサンプルを入れられるようにすること

    • isucon のコード持ってくるのもありか?

その他

この環境を構築するのに chatGPT が活躍したのでそれについて別途書く