世界中で動く Worker に、1つの数を正しく数えさせたい
記事に「いいね」ボタンを付けたいとします。押されたら数を1つ増やし、画面に今の数を出すだけです。
18号で見たとおり、Worker は世界中の拠点で動き、状態を持ちません。数をグローバル変数に入れても、次のリクエストを同じ isolate が受ける保証は無く、拠点ごとにばらばらの値になります。
では、20号の KV に入れればよいでしょうか。KV に「読んで +1 して書く」をすると、東京とロンドンで同時に押されたとき、どちらも「5」を読み、どちらも「6」を書きます。2回押されたのに1しか増えません。しかも KV は書き込みが行き渡るまで最大60秒ほどかかるので、その間は拠点ごとに違う数が見えます。図の4つの Worker が、それぞれ違う数を持っているのはこの状態です。
普通のサーバーなら、データベースのトランザクションやロックで守ります。でも、データベースが1か所にあれば世界中から遠く、ロックの待ち合わせで遅くなり、書き方も難しくなります。
「1つの正しい状態」が要る場面は、いいねの数だけではありません。
| 場面 | 1つの正しい状態 |
|---|---|
| チャットの部屋 | 誰が参加していて、どの順に発言したか |
| 共同編集の文書 | 今の文書の中身 |
| 予約・在庫 | 残りの枠がいくつか |
| ゲームの対戦 | 盤面の今の状態 |
この号で扱う Durable Objects(以下 DO)は、この問題に、とても単純な答えを出します。
※この号の内容は 2026年9月時点の情報をもとにしています。料金や上限は変わることがあるので、使うときは必ず公式のドキュメントで確かめてください。