Skip to content

Reduce Durable Objects duration by offloading SSE from DO #163

@liplus-lin-lay

Description

@liplus-lin-lay

purpose

Durable Objects の duration(GB-sec)が無料枠(13,000 GB-sec/日)を超過している問題に対処する。mcp-server のチャンネル接続を SSE から WebSocket に切り替え、DO hibernation を有効化する。

premise

  • WebhookStore DO の duration が全体の大部分を占めている(3日間で15.8k GB-sec)
  • 原因: mcp-server が SSE(EventSource)で接続 → DO が hibernation できずアクティブ時間が膨張
  • Worker DO側は WebSocket Hibernation API を正しく実装済み(this.ctx.acceptWebSocket() + 3ハンドラ)
  • DO のコメントに「SSE fallback は hibernation 中にイベントを逃す可能性がある」と明記
  • local-mcp にはすでに WebSocket 接続実装がある(local-mcp/src/index.ts L515-618)
  • Node.js 18+ にネイティブ WebSocket API があり、依存追加不要
  • mcp-server の engines>=18.0.0

constraints

  • チャンネル機能(リアルタイム通知)は維持する
  • Free プランの無料枠内に収める
  • local-mcp の WebSocket 実装パターンを参考にする
  • eventsource パッケージへの依存を除去可能

方針

mcp-server のチャンネル接続を EventSource(SSE)から ネイティブ WebSocket に切り替える。
local-mcp の実装(local-mcp/src/index.ts L515-618)を参考に移植。
25秒 keepalive、自動再接続(exponential backoff)を含む。

target files

  • mcp-server/server/index.js(チャンネル接続部分を SSE → WebSocket に変更)
  • mcp-server/package.json(eventsource 依存を除去、該当する場合)

Metadata

Metadata

Labels

enhancementNew feature or requestin-progress着手中、実装または検証が進行中

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions