プロダクトマネージャの仕事は一旦おやすみ。
今回は明後日に控えている 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 が活躍したのでそれについて別途書く