Slide 1

Slide 1 text

開発を愛する人(僕)が 最高にISUCONを楽しむ方法 logica X(旧Twitter): @logic0419 GitHub: logica0419 Zenn: logica0419

Slide 2

Slide 2 text

軽く自己紹介 logica 東京工業大学デジタル創作同好会traP所属 traQというOSSのメッセージングサービスの バックエンドメンテナンスリーダーをしてます ISUCON歴 ISUCON11: 予選敗退 ISUCON12: 学生枠で決勝進出、13位 「作問運営になりたい!」と公言している狂人です とにかく開発が大好きです

Slide 3

Slide 3 text

余談 「ISUCON夏祭り」という企画は僕の発言から出たかもしれないという話

Slide 4

Slide 4 text

ISUCONはDev?Ops?

Slide 5

Slide 5 text

ISUCONはDev?Ops? Dev (開発) 機能の開発を担当する ソフトウェアに新しい機能を追加 Ops (運用) サービスの運用を担当する 現在動いている環境を維持 サービスを安定して継続 → サービスの本質は変えないので、Opsが近いと考えてる (出典: https://pfs.nifcloud.com/navi/tech/devops.htm)

Slide 6

Slide 6 text

ISUCONをテーマに何か開発できるかも! 何につけても開発したがってしまうDev人間の性

Slide 7

Slide 7 text

というわけで色々作ってきた 今日はこれらを紹介していきます ① remote-bmi ISUCONベンチマーカーWeb UI ② helpisu ISUCONヘルパーライブラリ ③ gasshuku-isucon ?????????????

Slide 8

Slide 8 text

remote-bmi ISUCONの練習時に使える、簡易的なベンチマーカーWebUI https://github.com/logica0419/remote-bmi

Slide 9

Slide 9 text

ISUCON練習時のベンチマーカー操作 個人練・チーム内で練習するときを想定 公式ポータルをデプロイ あまりに大変 そもそも個人向けに作られてないので、機能が多すぎ CLIでコマンドを叩く いちいちSSHで入るのは面倒 ベンチマーカーのログは揮発するので、保存は自分でやる 「間」のソリューションが欲しい!

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

使い方

Slide 12

Slide 12 text

サーバーを登録!

Slide 13

Slide 13 text

ベンチマークを実行!

Slide 14

Slide 14 text

ログを閲覧! いつ、どのサーバーで回したかわかる それぞれのログをいつでも見れる(DBに保存) ログが見れるところを画像にしたかったがちゃんと環境建てられなかった

Slide 15

Slide 15 text

今後やりたいけどまだやれてないこと デプロイがめんどくさい 現在、デプロイは2通り リポジトリをクローンしてビルド 配布バイナリを持ってくる いずれにせよ設定とかは後からやらなきゃなので面倒!! 設定なしでコマンドたたけばすぐ使える、が理想 Dockerイメージのビルド docker-composeによる一発デプロイ

Slide 16

Slide 16 text

素振りの効率Upにぜひ! 今日素振りの大切さを説スピーカーは多くいますが、 素振りの支援ツールを発表するのは僕くらいでしょう

Slide 17

Slide 17 text

helpisu ISUCON helper library for Go https://github.com/logica0419/helpisu

Slide 18

Slide 18 text

こんなことありませんか? キャッシュ書くのだるい... 定期実行ってどんな感じで書くんだっけ... UUID・ULIDの生成方法忘れた!調べなきゃ!

Slide 19

Slide 19 text

それ、helpisuが全て解決します 特筆すべき機能を紹介

Slide 20

Slide 20 text

キャッシュ type Cache[K comparable, V any] struct func (c *Cache[K, V]) Get(key K) (value V, ok bool) func (c *Cache[K, V]) GetAndDelete(key K) (value V, ok bool) func (c *Cache[K, V]) Set(key K, value V) func (c *Cache[K, V]) Delete(key K) func (c *Cache[K, V]) Reset() func ResetAll() 実態は sync.Map のジェネリックなラッパー 全キャッシュ削除のAPIを持つ 生成したキャッシュをリストとして持っている アプリの初期化時に状態をリセットしやすいように作成

Slide 21

Slide 21 text

DB func WaitDBStartUp(db *sql.DB) type DBDisconnectDetector struct func (d *DBDisconnectDetector) RegisterDB(db *sql.DB) func (d *DBDisconnectDetector) Start() func (d *DBDisconnectDetector) Pause() func (d *DBDisconnectDetector) Stop() func (d *DBDisconnectDetector) Reset() 引数で渡したDBの立ち上がりまで終了しない関数 DBが切断された際、強制的にアプリケーションを落とすための構造体 ベンチマーキング中にできるだけ負荷をかけないよう、一時停止も

Slide 22

Slide 22 text

定期実行 func NewTicker(durationMS int, callback func()) *Ticker type Ticker struct func (t *Ticker) Start() func (t *Ticker) Stop() func (t *Ticker) Reset() 関数を定期実行することに特化した機能を持つ構造体 新規作成時にインターバルと関数を渡す Start() さえすればいい感じに全部やってくれる

Slide 23

Slide 23 text

ID生成 func NewUUID() string func NewULID() string 恐らくこのライブラリ内でトップレベルの狂気 ライブラリのDocsを見なくて一瞬で実装できるように

Slide 24

Slide 24 text

今後実装したい機能 Cache Sharer キャッシュの相互シェア機能 TCPで全サーバーを相互に網の目のようにつなぐ Write系処理時、全てのサーバーにキャッシュの変更を通知 Write-Heavyになること間違いなしだが、キャッシュだし大丈夫そう fibec Webフレームワークの載せ替えを一瞬で終わらせるためのライブラリ ただの狂気

Slide 25

Slide 25 text

ソースコードは公開してます! 使って / 参考にしてみてね (それで僕より強くなられるとちょっと辛いですが)

Slide 26

Slide 26 text

gasshuku-isucon ???????????????????????? https://github.com/logica0419/gasshuku-isucon

Slide 27

Slide 27 text

gasshuku-isucon logicaがお送りする、初めてのオリジナルISUCON! https://github.com/logica0419/gasshuku-isucon

Slide 28

Slide 28 text

時系列 ISUCONの作問者運営になりたい!(ISUCON12で公表) catatsuyさん公認の「弟子」に 941さんらに「とりあえず1問作ってみたら?と言われる ICTSCの運営などもあり、なかなか時間が無かった 2023/02のtraP春合宿でのISUCON開催に向け、急ピッチで制作 2週間ほどで全ての枠組みを組み終えました どうしてもベンチマーカーがうまく動かないまま放置 2023/06 catatsuyさんと対面でお話しし、ヒントをもらう 昨日の夜 何とか遊べる状態まで持っていく

Slide 29

Slide 29 text

それでは公開していきましょう https://github.com/logica0419/gasshuku-isucon

Slide 30

Slide 30 text

ずっとXで @ISUCON作ってます という Suffixをつけていましたが、 今日でようやく取れます

Slide 31

Slide 31 text

テーマ ボトルネックのネタバレにならないくらいで軽く触れていきましょう

Slide 32

Slide 32 text

図書館管理システム「isulibrary」 会員管理 新規登録・会員情報閲覧 延滞しすぎた人をBANする機能など 蔵書管理 新規登録・蔵書検索など 貸出管理 貸し出しと返却 主に3つに機能がカテゴライズされる

Slide 33

Slide 33 text

想定しているユーザー 2種類のアクセス経路がある 図書館内端末 蔵書検索専用の端末 図書館職員端末 図書館職員が使う、全機能にアクセス可能な端末 個人端末への静的配信が無いのが最大の特徴

Slide 34

Slide 34 text

このほかにも素晴らしい成果を上げているが このスライドはそれを語るには狭すぎる 詳しくはコードを見て下さい

Slide 35

Slide 35 text

今後やりたいこと ドキュメントの整備 競技ルール定まってないのは流石にヤバいので... Provisioningスクリプトの配備 みんなが同じ条件で解けるようにしたいですね Frontendの整備 普通にやってないだけです...

Slide 36

Slide 36 text

みなさんに協力してほしい事 まずは楽しんでほしい みなさんに楽しんでいただくのが何よりの喜びです バグ・粗の報告 現在ベンチマーカーのバランスはガバガバです みなさんのフィードバックをもとに改善していきたい 参考実装の移植 今Goしかないので、ぜひ他の言語のプロの皆さんにお任せしたい

Slide 37

Slide 37 text

ありがとうございました よき「ISUCON駆動開発」ライフを!