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

DurableObjects について

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for naporitan naporitan
August 01, 2024
480

DurableObjects について

Avatar for naporitan

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 を自由に設定することができない
 ◦ ダッシュボードからの設定も不可能