+ 作るログイン
図を読み込んでいます…
1 / 13
Cloudflare のすべて ― 1機能ずつ、仕組みと存在理由から / 全35本

Cloudflare 21:Durable Objects ― 名前ごとに世界に1つだけのオブジェクト

発行
アニメモ公式
版
第1版
改訂
コマ
全13

世界中で動く Worker に「1つの正しい状態」を持たせる Durable Objects を説明します。なぜ1つだけだと強い整合性になるのか、名前ごとに分けて大きくする考え方、オブジェクトごとの SQLite ストレージ、WebSocket とハイバネーション、アラーム、設定とマイグレーション、RPC での呼び出し、料金と落とし穴まで。

世界中で動く 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月時点の情報をもとにしています。料金や上限は変わることがあるので、使うときは必ず公式のドキュメントで確かめてください。

  • Cloudflare のすべて 21 ― Durable Objects
  • 1 / 13
  • 世界中で動く Worker に、1つの数を正しく数えさせたい
  • 本当は何回?
  • それぞれが「読んで +1 して書く」と、同時に来た分が消える
  • 東京の Worker
  • ロンドンの Worker
  • NYの Worker
  • サンパウロの Worker
  • いいね = 5
  • いいね = 7
  • いいね = 5
  • いいね = 6
  • チャットの部屋・共同編集の文書・在庫・予約の枠…「1つの正しい状態」が要る場面は多い
  • データベースのロックで守るのは難しく、遅い。もっと単純な答えが欲しい
  • Worker は状態を持たず、KV は遅れて揃う。正しい値の置き場が無い。

一言でいうと:名前ごとに世界に1つだけのオブジェクト

DO を一言でいうと、「名前ごとに、世界にちょうど1つだけ存在する、状態を持ったオブジェクト」です。

room:abc という名前の DO を呼ぶと、世界のどこから呼んでも、同じ1つの `room:abc` に届きます。東京の Worker も、サンパウロの Worker も、同じ相手と話します。2つ目の room:abc は、どこにも存在しません。

1つしか無いのだから、「今のいいねの数」は、その1つが持っている値が唯一の正しい値です。ばらばらになりようがありません。

DO は、次の2つがセットになったものです。

部品中身
コードあなたが書く JavaScript(TypeScript)のクラス。メソッドを持つ
保存場所そのオブジェクト専用のストレージ(SQLite)

プログラミングの「クラスとインスタンス」を思い浮かべると分かりやすいでしょう。ChatRoom というクラスを1つ書くと、room:abc、room:xyz … という名前ごとにインスタンスが作られます。違うのは、そのインスタンスが世界に1つだけで、自分の保存場所を持ち、Cloudflare の網の中で生き続けることです。

Worker の役目は、「どの名前の DO に用があるか」を決めて呼び出すことだけになります。状態を持つのは DO、というように役割が分かれます。

  • Cloudflare のすべて 21 ― Durable Objects
  • 2 / 13
  • 一言でいうと:名前ごとに世界に1つだけのオブジェクト
  • room:abc(世界に1つ)
  • いいね = 12
  • 東京の Worker
  • ロンドンの Worker
  • NYの Worker
  • サンパウロの Worker
  • コード(クラス)と、そのオブジェクト専用の保存場所がセットになっている
  • 状態を持つのはオブジェクトだけ。Worker は名前を指定して呼び出すだけ
  • 同じ名前で呼べば、世界中のどこからでも同じ1つに届く。

1つだから、1つずつ処理できる

DO が「1つだけ」であることには、もう1つ大きな意味があります。1つのオブジェクトの中では、処理が1つずつ進むのです。

JavaScript は、もともと1つの流れ(シングルスレッド)で動く言語です。DO は1つの場所で1つの流れとして動くので、東京とロンドンから同時に「+1」が届いても、どちらかが先、どちらかが後に処理されます。図の左で「+1」が順番待ちをしているのはこの様子です。

方式同時に「+1」が2つ来たら
KV で読んで書く両方が5を読み、両方が6を書く(1回分消える)
DO の中で数える1つ目が5→6、2つ目が6→7(正しく7になる)

さらに、DO は保存場所(ストレージ)の読み書きをしている間、他のリクエストが割り込まないように自動で入口を閉じます(入力ゲート)。そのため、「読んで、+1 して、書く」を普通に書くだけで、ロックもトランザクションも意識せずに正しく数えられます。

このように、「書いた直後から、誰が読んでも新しい値が見える」性質を、強い整合性と呼びます。20号の KV の結果整合性とは反対の性質です。

1つだけ気をつけたいのは、外部への fetch を await している間です。この間は他のリクエストが先に進めるので、その前後で値が変わっていることがあります。ストレージの読み書きだけで完結する処理は安全、と覚えておきましょう。

  • Cloudflare のすべて 21 ― Durable Objects
  • 3 / 13
  • 1つだから、1つずつ処理できる
  • room:abc(世界に1つ)
  • +1
  • +1
  • +1
  • いいね = 15
  • 順番待ち
  • 東京の Worker
  • ロンドンの Worker
  • NYの Worker
  • サンパウロの Worker
  • 1つのオブジェクトの中では、JavaScript の処理は一度に1つだけ進む
  • 読んで +1 して書く、の間に他の人が割り込めない = 強い整合性
  • 同時に来ても順番に並ぶ。ロックを考えなくても数え漏れない。

名前ごとに別のオブジェクト。だから数を増やせる

「1つだけ」「1つずつ処理」と聞くと、「それでは遅いのでは」と心配になるかもしれません。確かに、1つの DO がこなせる量には限りがあります。

DO の考え方の肝は、1つに全部を集めないことです。名前ごとに別のオブジェクトになるので、チャットなら部屋ごとに1つ、共同編集なら文書ごとに1つ、いいねなら記事ごとに1つ、と分けます。

用途名前の付け方オブジェクトの数
チャットroom:<部屋の ID>部屋の数だけ
共同編集doc:<文書の ID>文書の数だけ
いいねpost:<記事の ID>記事の数だけ
利用者ごとのレート制限user:<利用者の ID>利用者の数だけ

オブジェクトはいくつ作っても構いません。何百万個でも作れます。1つ1つは小さく、それぞれが「自分の部屋」のことだけを正しく扱います。全体としては、部屋が増えるほどオブジェクトも増えるので、いくらでも大きくできるのです。

DO は、最初に呼ばれた場所の近くに作られ、そこに住み続けます。東京の利用者が作ったチャットの部屋は、東京の近くにできます。作る場所の希望(location hint)を指定することもできます。

逆にいえば、1つの DO は1か所にしかいないので、地球の反対側の利用者から呼ばれると、そのぶん往復の時間がかかります。これは「世界に1つ」の代償です。

  • Cloudflare のすべて 21 ― Durable Objects
  • 4 / 13
  • 名前ごとに別のオブジェクト。だから数を増やせる
  • room:abc
  • room:xyz
  • user:12
  • いいね = 15
  • いいね = 3
  • 既読 = 40件
  • 東京の Worker
  • ロンドンの Worker
  • NYの Worker
  • サンパウロの Worker
  • 名前 → オブジェクトは一対一。オブジェクトはいくつ作ってもよい(何百万でも)
  • 最初に呼ばれた場所の近くに作られ、そこに住み続ける
  • 部屋ごと・文書ごと・利用者ごとに1つ。1つに全部を集めない。

中に SQLite:状態と保存場所が同じ場所にある

DO は、それぞれ自分専用の保存場所を持っています。今の標準は SQLite です。オブジェクト1つにつき、1つの小さな SQLite データベースが付いてくる、と考えてください。

図のとおり、DO の中には2種類の置き場があります。

置き場特徴
メモリ(クラスのフィールド)速いが、オブジェクトがしばらく使われずに片付けられると消える
SQLite ストレージずっと残る。ctx.storage.sql から SQL で読み書きする

SQLite は、DO と同じ機械の上にあります。普通のデータベースのように、ネットワークの向こうへ問い合わせに行く必要がありません。そのため、読み書きはとても速く、1つのリクエストの中で何十回と SQL を実行しても気になりません。

ts
this.ctx.storage.sql.exec(
  "CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY, user TEXT, body TEXT, ts INTEGER)",
);
this.ctx.storage.sql.exec(
  "INSERT INTO messages (user, body, ts) VALUES (?, ?, ?)", user, body, Date.now(),
);
const recent = this.ctx.storage.sql
  .exec("SELECT user, body FROM messages ORDER BY id DESC LIMIT 50")
  .toArray();

データは、オブジェクトごとに完全に分かれています。room:abc の DO から、room:xyz のデータは見えません。全部の部屋をまとめて検索・集計したいときは、D1(23号)などに別に書き出します。

ほかに、キーと値で読み書きする API(ctx.storage.get / put)もあります。

  • Cloudflare のすべて 21 ― Durable Objects
  • 5 / 13
  • 中に SQLite:状態と保存場所が同じ場所にある
  • room:abc
  • メモリ
  • SQLite
  • 処理中の値
  • ctx.storage.sql
  • いなくなると消える
  • ずっと残る
  • オブジェクトごとに自分だけのデータベース。他のオブジェクトからは見えない
  • オブジェクト専用のデータベースが隣にあるので、読み書きがとても速い。

WebSocket:部屋に全員がつながり、1か所から配る

チャットや共同編集では、誰かが書いた内容を、同じ部屋の全員へすぐに届ける必要があります。そのために使うのが WebSocket(ブラウザとサーバーがつなぎっぱなしで、双方向にやりとりできる通信)です。

普通の Worker では、これが難しいのです。同じ部屋の利用者が、それぞれ別の拠点の別の Worker につながってしまうからです。

DO を使うと、話は単純になります。部屋の全員が、同じ1つの DO に WebSocket でつながるのです。

順番何が起きるか
1利用者が部屋に入ると、Worker が room:abc の DO へ接続を渡す
2DO は、その部屋の全員の接続を持っている
3誰かが発言すると、DO が受け取り、SQLite に保存する
4DO が、つながっている全員に同じ発言を送る

1か所に集まっているので、発言の順番も全員で同じになります。

ここで気になるのが料金です。チャットの部屋は、つながっているだけで誰も話していない時間が長いものです。その間ずっと DO が起きていると、時間の分だけ料金がかかります。

そこで、ハイバネーション(冬眠)という仕組みがあります。専用の WebSocket の API を使うと、メッセージが来ない間、DO は接続をつないだまま眠り、料金の数えられる時間が止まります。メッセージが届くと自動で起き、処理が終わるとまた眠ります。WebSocket を使うなら、ハイバネーションに対応した API を使うのが基本です。

  • Cloudflare のすべて 21 ― Durable Objects
  • 6 / 13
  • WebSocket:部屋に全員がつながり、1か所から配る
  • room:abc
  • 4人が接続中
  • 東京の利用者
  • ロンドンの利用者
  • NYの利用者
  • サンパウロの利用者
  • 誰かが書く → オブジェクトが受け取る → 部屋の全員へ送り返す
  • ハイバネーション:静かな間は眠って料金を止め、接続はそのまま保つ
  • チャットや共同編集は、1つのオブジェクトが全員の接続を持てば作れる。

アラーム:あとで自分を起こす

DO は、リクエストが来たときだけでなく、決めた時刻に自分で起きることもできます。これがアラームです。

ts
export class ChatRoom extends DurableObject {
  async onMessage() {
    // 10分後に起こしてもらう(オブジェクトごとに1つ設定できる)
    await this.ctx.storage.setAlarm(Date.now() + 10 * 60 * 1000);
  }

  async alarm() {
    // 時間が来ると呼ばれる。24時間より古い発言を片付ける
    this.ctx.storage.sql.exec(
      "DELETE FROM messages WHERE ts < ?", Date.now() - 24 * 60 * 60 * 1000,
    );
  }
}

アラームは、次のような「あとで」の処理に向いています。

使い方例
片付け古いデータを消す、誰もいなくなった部屋を閉じる
期限予約の仮押さえを、10分たったら取り消す
まとめて送る集まったデータを、1分ごとに外へ書き出す

アラームの時刻は保存場所に記録されるので、DO が一度片付けられても、時間が来ればちゃんと起こされます。alarm() の中でエラーが起きた場合は、自動で再試行されます。

全体に対して「毎日0時に」のような定期実行をしたいときは、Cron Triggers(25号)を使います。アラームは、そのオブジェクト自身の「あとで」を扱うための仕組みです。

  • Cloudflare のすべて 21 ― Durable Objects
  • 7 / 13
  • アラーム:あとで自分を起こす
  • room:abc
  • 次のアラーム:10分後
  • await this.ctx.storage.setAlarm(Date.now() + 10 * 60 * 1000);
  • async alarm() { // 時間が来ると呼ばれる。失敗したら自動で再試行
  • this.ctx.storage.sql.exec("DELETE FROM messages WHERE ts < ?", Date.now() - 86400000);
  • }
  • 「10分後に片付ける」「期限が来たら締める」を、外の仕組みなしで書ける。

導入:クラスを書き、設定でバインディングとマイグレーション

DO は Worker のプロジェクトの中で作ります。必要なのは、クラスのコードと、設定ファイルへの2つの記入です。

jsonc
{
  "name": "chat",
  "main": "src/index.ts",
  "compatibility_date": "2026-09-01",
  "durable_objects": {
    "bindings": [{ "name": "ROOM", "class_name": "ChatRoom" }]
  },
  "migrations": [
    { "tag": "v1", "new_sqlite_classes": ["ChatRoom"] }
  ]
}
項目意味
bindingsWorker のコードから env.ROOM として使う。中身は ChatRoom クラス
migrationsDO のクラスを「作った・名前を変えた・消した」の記録
new_sqlite_classesこのクラスを、SQLite の保存場所付きで作る

マイグレーションは、DO ならではの項目です。DO は保存場所を持つので、クラスを追加したり名前を変えたりするときに、Cloudflare に「このクラスのデータをどう扱うか」を伝える必要があります。クラスを足すたびに、tag を変えた新しい行を追記していきます。前の行を書き換えてはいけません。

新しく作るクラスは、new_sqlite_classes に書きます。SQLite 型が現在のおすすめで、Free プランで使えるのも SQLite 型だけです。

クラスは、Worker の入口のファイルから export しておきます。あとは npx wrangler dev で手元で試し、npx wrangler deploy で配るのは、18号の Worker とまったく同じです。

  • Cloudflare のすべて 21 ― Durable Objects
  • 8 / 13
  • 導入:クラスを書き、設定でバインディングとマイグレーション
  • // wrangler.jsonc
  • "durable_objects": {
  • "bindings": [{ "name": "ROOM", "class_name": "ChatRoom" }]
  • },
  • "migrations": [
  • { "tag": "v1", "new_sqlite_classes": ["ChatRoom"] }
  • ]
  • クラスを足す・名前を変える・消すときは、migrations に新しい tag を足していく
  • 新しく作るクラスは new_sqlite_classes に書く。これで SQLite 付きになる。

使い方:Worker から名前で呼び、メソッドを呼ぶ

いいねを数える DO の全体を見てみましょう。

ts
import { DurableObject } from "cloudflare:workers";

export class Counter extends DurableObject<Env> {
  constructor(ctx: DurableObjectState, env: Env) {
    super(ctx, env);
    ctx.storage.sql.exec("CREATE TABLE IF NOT EXISTS c (n INTEGER)");
    ctx.storage.sql.exec("INSERT INTO c SELECT 0 WHERE NOT EXISTS (SELECT 1 FROM c)");
  }

  async increment(): Promise<number> {
    this.ctx.storage.sql.exec("UPDATE c SET n = n + 1");
    return this.ctx.storage.sql.exec<{ n: number }>("SELECT n FROM c").one().n;
  }
}

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const postId = new URL(request.url).searchParams.get("post") ?? "1";
    const stub = env.COUNTER.getByName(`post:${postId}`); // 世界に1つの post:<ID>
    const n = await stub.increment();                      // メソッドを直接呼ぶ
    return Response.json({ likes: n });
  },
};

流れは3段です。

段何をしているか
名前で取るgetByName("post:42") で、その名前の DO への窓口(スタブ)を得る
呼ぶスタブのメソッドを、普通の関数のように await で呼ぶ(RPC)
中で処理DO の中で SQL を実行し、結果を返す

getByName は、内部では「名前から ID を作る(idFromName)」と「ID からスタブを得る(get)」をまとめたものです。同じ名前からは必ず同じ ID ができるので、世界中のどこからでも同じオブジェクトに届きます。

スタブのメソッド呼び出しは、見た目は普通の関数ですが、実際には DO の住んでいる場所への通信です。1回のリクエストで何度も呼ぶより、必要な処理を DO のメソッド1つにまとめたほうが速くなります。

  • Cloudflare のすべて 21 ― Durable Objects
  • 9 / 13
  • 使い方:Worker から名前で呼び、メソッドを呼ぶ
  • export class Counter extends DurableObject {
  • async increment() {
  • this.ctx.storage.sql.exec("UPDATE c SET n = n + 1");
  • return this.ctx.storage.sql.exec("SELECT n FROM c").one().n;
  • }
  • }
  • // Worker の側
  • const stub = env.COUNTER.getByName("post:42"); // 世界に1つの post:42
  • const n = await stub.increment();
  • getByName で「その名前の1つ」を取り、普通の関数のように呼ぶ(RPC)。

料金と制限:「回数」と「起きていた時間」と「保存」

DO の料金は、いくつかの要素を足したものです。2026年9月時点の考え方は次のとおりです。料金・上限は変わるので、必ず公式の Pricing と Limits のページで確かめてください。

項目内容
使えるプランFree でも使える(SQLite 型のみ)。Paid は月額の Workers Paid に含まれる無料分を超えると従量
リクエストDO への呼び出しの回数
時間(duration)DO が起きてメモリにいた時間。メモリの量と時間の掛け算で数える
SQLite ストレージ読んだ行・書いた行の数と、保存している量
WebSocket受け取ったメッセージは、何通かで1リクエストと数える割引がある

注意したいのは時間です。DO は、処理をしていなくても、メモリに残っている間は時間が数えられることがあります。たとえば、WebSocket をハイバネーションに対応しない API でつなぎっぱなしにすると、誰も話していない間も起きたままになり、時間の料金が積み上がります。

逆に、眠れる状態の DO は時間を数えません。ハイバネーションに対応した WebSocket の API を使い、不要なタイマーを残さないように作ると、待っている時間の料金はほぼかからなくなります。

制限としては、1つの DO の保存量、1つの DO が1秒間にこなせる処理の量などがあります。1つの DO で捌ききれない量が来るなら、名前の付け方を見直して、もっと細かく分けるのが基本の対策です。

  • Cloudflare のすべて 21 ― Durable Objects
  • 10 / 13
  • 料金と制限:「回数」と「起きていた時間」と「保存」
  • 使えるプラン
  • Free でも使える(SQLite 型のみ)
  • 数えるもの
  • リクエストの回数・動いていた時間
  • 保存
  • SQLite の行の読み書きと保存量
  • WebSocket
  • 受け取るメッセージは割り引いて数える
  • 眠っている間
  • ハイバネーション中は時間を数えない
  • 2026年9月時点。上限・料金は変わるので、公式の Pricing と Limits のページで確かめること
  • 無料枠あり。眠れるように作ると、待っている時間のお金がかからない。

よくある落とし穴

DO でよくつまずく点をまとめます。

落とし穴何が起きるかどうするか
全体で1つの DO を作るglobal という名前の1つに全員が集まり、順番待ちで遅くなる部屋・文書・利用者など、自然な単位で分ける
メモリだけに状態を置くしばらく使われないと DO は片付けられ、フィールドの値が消える残したいものは必ず SQLite に書く
遠い利用者から呼ぶDO は1か所に住むので、反対側の利用者は往復が長い利用者の多い地域に作る(location hint)。読み取り中心なら KV を前に置く
await 中の割り込みを忘れる外部への fetch を待つ間に、他のリクエストが状態を変える大事な判断はストレージの読み書きの中で完結させる
マイグレーションを書き換える前の tag の行を直すと、デプロイが失敗したりデータの扱いが食い違ういつも新しい tag を追記する

特に1つ目は、DO を初めて使う人がいちばんやりがちな失敗です。「世界に1つ」で正しく数えられることに安心して、サイト全体の数を1つの DO に集めてしまうのです。DO は「小さなものを、たくさん」作るための仕組みだと覚えておきましょう。

全体の合計が欲しいときは、各 DO が自分の数をときどき(アラームなどで)D1 や KV に書き出し、合計はそちらで出す、という形にします。

  • Cloudflare のすべて 21 ― Durable Objects
  • 11 / 13
  • よくある落とし穴
  • 全体で1つのオブジェクト:すべてが1か所に並んで遅くなる
  • メモリだけに状態を置く:いなくなると消える。storage に書く
  • 遠い利用者から呼ぶ:オブジェクトは1か所に住むので往復がある
  • await 中の割り込みを忘れる:外への fetch の間は他が進む
  • 部屋・文書・利用者ごとに分け、状態は SQLite に
  • 1つのオブジェクトは1か所で1つずつ。全員を1つに集めると詰まる。

他の号とのつながり

DO は、他の多くの機能と組み合わせて使います。

号機能DO との関係
18WorkersDO を呼び出す入口。DO 自身も Workers の仕組みの上で動く
20KVたまに書き、世界中で読むもの。「正しく数える」は DO、「速く配る」は KV
23D1全体を横断して検索・集計するデータ。DO から書き出す先にもなる
24QueuesDO で受けた処理のうち、重いものを後回しにする
25Workflows と Cron Triggers全体の定期実行や、長い手順。DO のアラームは「自分の」あとで
27Containersコンテナを動かす仕組み。コンテナ1つ1つの制御に DO が使われている
28Workers AIAI の会話の履歴を、会話ごとの DO に持たせる使い方がある
06レート制限利用者ごとに回数を正しく数えたいとき、DO で自作することもできる

AI のエージェントを作るための Cloudflare の道具(Agents SDK)も、会話やエージェントごとの状態を DO に持たせる作りになっています。「1つの相手ごとに、状態を持った小さなサーバーを1つ」という DO の考え方は、いろいろな場面の土台になっています。

  • Cloudflare のすべて 21 ― Durable Objects
  • 12 / 13
  • 他の号とのつながり
  • 18 Workers
  • 20 KV
  • 23 D1
  • 24 Queues
  • Durable Objects(21)
  • 25 Workflows
  • 27 Containers
  • 28 Workers AI
  • 06 レート制限
  • Workers から呼び、KV で足りない「正しく数える」を受け持つ。

まとめ:DO は「名前ごとに1つ」の、状態を持つ小さなサーバー

この号で見たことをまとめます。

項目内容
なぜあるか状態を持たない Worker と、遅れて揃う KV では「1つの正しい状態」が持てないため
仕組み名前ごとに世界に1つだけのオブジェクト。中の処理は1つずつ進む(強い整合性)
大きくするには部屋・文書・利用者ごとに分ける。数はいくらでも作れる
保存オブジェクトごとの SQLite(ctx.storage.sql)
つながり続けるWebSocket で全員が同じ DO につながる。ハイバネーションで眠れる
あとでアラームで自分を起こす
導入設定にバインディングと new_sqlite_classes のマイグレーション
呼び方env.名前.getByName("…") でスタブを得て、メソッドを呼ぶ
注意1つに集めない、メモリに頼らない、遠い利用者との往復

DO は、「分散したシステムで、正しく数える・揃える」という難しい問題を、「1つだけにして、1つずつ処理する」という単純な考え方で解きます。その代わり、たくさんに分けて使うのが前提です。次の22号では、ファイルを置くための R2 を見ていきます。

  • Cloudflare のすべて 21 ― Durable Objects
  • 13 / 13
  • まとめ:DO は「名前ごとに1つ」の、状態を持つ小さなサーバー
  • room:abc
  • room:xyz
  • user:12
  • いいね = 15
  • いいね = 3
  • 既読 = 40件
  • 東京の Worker
  • ロンドンの Worker
  • NYの Worker
  • サンパウロの Worker
  • 1つずつ処理 → 強い整合性 / 中に SQLite / WebSocket とアラーム
  • チャット・カウンター・共同編集・予約の枠・レート制限に
  • 1つだから正しく、名前で分けるから大きくできる。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]