Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DurableObjects について

naporitan
August 01, 2024
230

DurableObjects について

naporitan

August 01, 2024
Tweet

Transcript

  1. ## Take Home Message • WebSocket は DurableObjects によって身近なものになった
 •

    Hibernation API が便利
 • ライブラリ作ったのでぜひ使ってください!

  2. ## 自己紹介 • name: naporitan ◦ twitter: naporin24690, github: naporin0624

    • hono/client を中心にコントリビューション ◦ https://github.com/honojs/hono/graphs/contributors
 • Cloudflare Workers をフロントエンドの拡張の視点から調査
 ◦ y-durableobjects
 ◦ Demo of `next/image` using Cloudflare Transform images

  3. ## Durable Objects 登場 • id ごとに 1 つのオブジェクト対応
 •

    強整合な KV 付属
 • JS RPC が利用できる
 • WebSocket を払い出せる
 DurableObject 実装例

  4. ### JS RPC • class で定義した method が使える
 • chimame

    さんの記事がわかりやすいです

  5. ### Hibernation API とは • サーバーが休止状態になる
 ◦ 接続を維持したまま休止する 
 ◦

    休止している間は料金が発生しない 
 • 専用 API が存在する
 ◦ webSocketMessage
 ◦ webSocketError
 ◦ webSocketClose
 ◦ etc…

  6. ### サーバーが休止状態になるとは • だいたい 5 ~ 10s message のやり取りがないと閉じられる
 ◦

    class の状態はサーバーが休止状態になる度に揮発する 
 ◦ 永続化したい状態を保存するときは Transaction Storage に入れる
 • メソッドが呼ばれると起動
 ◦ WebSocket イベント・alarm・JS RPC
 • constructor で非同期処理をするときは blockConcurrencyWhile を使用する

  7. ### ping/pong • 死んだコネクションを自動的に切りたい
 ◦ ws の ping 相当が欲しい
 •

    ping/pong frame でやり取りしてる
 ◦ WebSocket サーバーの記述 - Web API | MDN
 ◦ ping は 0x09, pong は 0xA

  8. #### WebSocket には ping/pong frame がない • Web API の

    WebSocket には ping/pong frame を送信する術がない
 ◦ Sending websocket ping/pong frame from browser - Stack Overflow
 ◦ https://websockets.spec.whatwg.org/#ping-and-pong-frames
 ▪ > These are not currently exposed in the API.

  9. ### ping/pong • 特定の message でやり取りする
 ◦ client から ping

    が来たら server で pong する(逆でも可)
 ◦ Hibernation API を利用してる場合、休止状態から復帰してしまう 
 ▪ クライアント数増加に伴い休止する時間が少なくなる 
 • 意味ない

  10. ### DurableObject JS RPC • WebSocket が JS RPC でサポートされていない


    ◦ https://github.com/cloudflare/workerd/issues/2319
 JS RPC で WebSocket を払い出す
 RPC 経由で WebSocket を返す

  11. ### DurableObject JS RPC • WebSocket が JS RPC でサポートされていない


    ◦ https://github.com/cloudflare/workerd/issues/2319
 WebSocket は Serialize できずエラー

  12. ### JS RPC + Hono RPC • fetch で WebSocket

    の発行
 • RPC でその他ロジック実行

  13. ### JS RPC + Hono RPC • fetch で WebSocket

    の発行
 • RPC でその他ロジック実行

  14. ### JS RPC + Hono RPC • fetch で WebSocket

    の発行
 • RPC でその他ロジック実行

  15. ### JS RPC + Hono RPC • fetch で WebSocket

    の発行
 • RPC でその他ロジック実行

  16. ### JS RPC + Hono RPC • ロジックを method で定義


    • Hono で fetch 経由で method 実行

  17. ### JS RPC + Hono RPC • ロジックを method で定義


    • Hono で fetch 経由で method 実行

  18. ### JS RPC + Hono RPC • ロジックを method で定義


    • Hono で fetch 経由で method 実行

  19. End

  20. ## (おまけ) PartyKit • Durable Objects を扱うためのもう一つのやり方
 • Hibernation API

    が option 1 つで切り替えられる
 • Cloudflare Workers と Durable Objects を 1 つの class で定義
 ◦ onStart, onConnect, onRequest など直感的な interface を採用
 • yjs のサーバー実装・client 実装もあるためアプリケーションに組み込みやすくなっ ている

  21. ## (おまけ) PartyKit • OSS だがビルドサーバーが partykit 側にあるため最終成果物がどうなっているか わからない
 •

    binding を自由に設定することができない
 ◦ ダッシュボードからの設定も不可能