Featured image of post コードウィザード シリーズ目次

コードウィザード シリーズ目次

見習い魔術師ルークの失敗と、師匠の問いから生まれる設計を、Kotlin のコードで追う全12話の目次。困りごと別の一覧から、読みたい話を選べます。

Featured image of post 終了シグナルを受けて即座に落とすと、処理中のリクエストと接続を取り残す。新規を止めて、処理中を待ってから閉じる【Graceful Shutdown】

終了シグナルを受けて即座に落とすと、処理中のリクエストと接続を取り残す。新規を止めて、処理中を待ってから閉じる【Graceful Shutdown】

終了シグナルで即座に落とすと、処理中の仕事を切り捨て、接続やロックが解放されないまま残る。新規の受け付けを止め、処理中のものが終わるのを期限つきで待ってから閉じる。TypeScript で実装します。

連載 コード調教師 (第12話 / 全12話)
Featured image of post 重い処理が接続を使い切り、大事な処理が動けなくなる。機能ごとに使える枠を分けておく【Bulkhead】

重い処理が接続を使い切り、大事な処理が動けなくなる。機能ごとに使える枠を分けておく【Bulkhead】

重い処理が共有の接続プールを使い切り、健全な別機能まで動けなくなる。リソースを機能ごとの枠に分け、片方が溢れても他方の取り分が守られるようにする。TypeScript で実装します。

Featured image of post 落ちた外部サービスを待ち続けて、無関係な機能まで巻き込んで止まる。失敗が続いたら呼ぶのをやめる【Circuit Breaker】

落ちた外部サービスを待ち続けて、無関係な機能まで巻き込んで止まる。失敗が続いたら呼ぶのをやめる【Circuit Breaker】

依存先が落ちると、その応答待ちで自分のリソースが尽き、関係ない機能まで止まる。失敗が続いたら呼び出しを断って代替を返し、頃合いを見て試し、戻ったら再開する。TypeScript で実装します。

Featured image of post 通知を取りこぼした画面だけ、古い状態のまま戻らない。push と定期取得を併用して必ず追いつかせる【Eventual Consistency】

通知を取りこぼした画面だけ、古い状態のまま戻らない。push と定期取得を併用して必ず追いつかせる【Eventual Consistency】

push 通知を取りこぼした側が、古い状態のまま戻らない。push に定期取得を足し、バージョンで束ねて、遅れても必ず追いつき、古い通知では状態を戻さないようにする。TypeScript で実装します。

Featured image of post 同時に更新した片方が、気づかないうちに消えている。バージョンを持たせて衝突した方にやり直させる【Optimistic Locking】

同時に更新した片方が、気づかないうちに消えている。バージョンを持たせて衝突した方にやり直させる【Optimistic Locking】

在庫を読んでから書き戻すまでの隙に別の更新が入り、一方の更新が黙って上書きされる(Lost Update)。値にバージョンを持たせ、衝突した側だけ読み直してやり直させる。TypeScript で実装します。

Featured image of post boolean フラグを足すたびに、ありえない状態が増えていく。状態を1つの型にまとめて書けなくする【State Machine】

boolean フラグを足すたびに、ありえない状態が増えていく。状態を1つの型にまとめて書けなくする【State Machine】

フラグを1つ足すたびに、「待機中かつ実行中」のようなありえない組み合わせが倍に増える。状態を判別可能ユニオンにまとめ、遷移を型で縛る。TypeScript で実装し、足し忘れも型で止めます。

Featured image of post 上限は守っているのに、切り替わりの一瞬だけ2倍通ってしまう。窓で区切らず溜まる速さで制限する【Token Bucket】

上限は守っているのに、切り替わりの一瞬だけ2倍通ってしまう。窓で区切らず溜まる速さで制限する【Token Bucket】

1分あたりの上限を決めても、固定窓の境目をまたぐと上限の2倍が通り抜ける。窓の区切りをやめ、トークンが一定の速さで溜まる Token Bucket に替えて流量を抑える。TypeScript で実装します。

Featured image of post 2つの処理が互いのロックを待ち合って、永久に止まる。ロックを取る順番を全体で1つに揃える【Deadlock】

2つの処理が互いのロックを待ち合って、永久に止まる。ロックを取る順番を全体で1つに揃える【Deadlock】

JavaScript はシングルスレッドでも、ロックを取り合う2つの処理が互いを待って永久に止まる。ロックを取る順を全体で揃えて循環を断ち、タイムアウトの限界にも触れる。TypeScript で実装します。

Featured image of post 並列数を上げたら、かえって全体が落ちた。同時に動く数を上限で絞って待たせる【Semaphore】

並列数を上げたら、かえって全体が落ちた。同時に動く数を上限で絞って待たせる【Semaphore】

非同期処理を一斉に走らせると、相手の接続を取り合って共倒れになる。同時に通す数を N に絞り、溢れた分は行列で待たせる(Semaphore)。TypeScript で実装し、同時実行数の最大値をテストで確かめます。

Featured image of post 障害のたびにリトライを連発し、かえって復旧を遅らせる。待ち時間を倍々に伸ばして散らす【Exponential Backoff】

障害のたびにリトライを連発し、かえって復旧を遅らせる。待ち時間を倍々に伸ばして散らす【Exponential Backoff】

相手が落ちるたびに即リトライすると、回復する前にリクエストを使い果たし、再開時に殺到する。待ちを倍に伸ばす指数バックオフと、ばらつきを足す Full Jitter で避ける。TypeScript で実装します。

Featured image of post 消したはずの検索が裏で動き続け、リソースを握ったまま離さない。キャンセルを最後まで伝える【AbortController】

消したはずの検索が裏で動き続け、リソースを握ったまま離さない。キャンセルを最後まで伝える【AbortController】

キャンセルした非同期処理が裏で動き続け、接続やカーソルを握りっぱなしになる。AbortSignal を処理の前・中・待機中の3か所で見るようにして止める。TypeScript で実装します。

Featured image of post ボタンを連打すると、同じ処理が二重に走って二重送信になる。await をまたぐ前に実行中フラグを立てて締め出す【Race Condition】

ボタンを連打すると、同じ処理が二重に走って二重送信になる。await をまたぐ前に実行中フラグを立てて締め出す【Race Condition】

非同期処理の途中(await の間)に同じ操作がもう一度入り、二重送信になる。実行中フラグを置く位置を直し、二度目の呼び出しを締め出す。TypeScript で実装し、テストで確かめます。

連載 コード調教師 (第1話 / 全12話)