File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ # Knowledge Base
2+
3+ 運用・開発で得た知見をまとめる。
4+
5+ ## Cloudflare Durable Object の storage 制限
6+
7+ ** 発生日** : 2026-02-23
8+ ** 症状** : ` bit relay sync push ` が HTTP 500 (Cloudflare error 1101) を返す
9+ ** 原因** : ` RelayRoom ` DO の ` storage.put() ` でスナップショットが 128 KiB/value 制限を超過
10+
11+ ### 背景
12+
13+ ` RelayRoom ` DO はリクエストごとにメモリ上の全状態(メッセージ + 鍵 + nonce)を単一キーにシリアライズして永続化していた。
14+
15+ ```
16+ snapshot = messages (最大1000件 × 最大64KB) + keys + nonces
17+ ```
18+
19+ ベンチマークやテストデータの蓄積でスナップショットが肥大化し、` storage.put() ` が例外を投げた。try-catch がなかったため Worker 全体が 500 を返していた。
20+
21+ ### 暫定対処
22+
23+ - ` storage.put() ` / ` storage.get() ` を try-catch でラップ
24+ - persistence は best-effort とし、失敗してもリクエストは成功を返す
25+
26+ ### 根本対策(TODO)
27+
28+ スナップショットの分割永続化を実装する:
29+
30+ 1 . ** keys/nonces は必須永続化** : TOFU の鍵レジストリと nonce は DO 再起動後も維持が必要。これだけなら 128 KiB に収まる
31+ 2 . ** messages は揮発性でよい** : メッセージはクライアントが poll で取得するもの。DO 再起動で消えても、クライアントは next cursor から再取得するだけ
32+ 3 . ** 分割案** :
33+ - ` relay_keys_v1 ` : keys_by_sender + nonces_by_sender
34+ - ` relay_rooms_v1:{room} ` : room ごとのメッセージ(上限制御付き)
35+ - または messages の永続化自体をやめる
36+
37+ ### Cloudflare DO storage の制約まとめ
38+
39+ | 制約 | 値 |
40+ | ------| -----|
41+ | 1 value あたりの最大サイズ | 128 KiB |
42+ | 1 key あたりの最大サイズ | 2 KiB |
43+ | 1 リクエストあたりの put/get 回数 | 制限なし(ただし課金対象) |
44+ | DO インスタンスのメモリ | 128 MB |
45+
46+ ## Git ルートの named/random セッション曖昧性
47+
48+ ** 発生日** : 2026-02-23
49+ ** 症状** : ` bit clone relay+https://.../AbCdEfGh ` が 404 を返す
50+ ** 原因** : ` /git/AbCdEfGh/info/refs ` が named session パターン ` /git/<owner>/<repo>/<path> ` に先にマッチし、セッション ID が ` AbCdEfGh/info ` として解釈されていた
51+
52+ ### 対処
53+
54+ named match と random match の両方を評価し、named が 404 なら random にフォールバックするよう修正。
55+
56+ ### 教訓
57+
58+ URL パターンが重複する場合、片方のマッチだけで確定させず、フォールバックを設けること。Deno 版は ` gitServeSessions.has() ` でメモリ内チェックしていたため問題なかったが、CF 版は DO が存在チェックなしに生成されるためフォールバックが必要だった。
You can’t perform that action at this time.
0 commit comments