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

10分で完全に理解出来る Cloudflare Workers + HyperDrive / ...

10分で完全に理解出来る Cloudflare Workers + HyperDrive / Cloudflare Workers + HyperDrive: You Might Understand It in Just 10 Minutes

社内勉強会向け資料

Avatar for Taiyu Yoshizawa

Taiyu Yoshizawa

February 02, 2026

More Decks by Taiyu Yoshizawa

Other Decks in Technology

Transcript

  1. Cloudflare Workersとは ! ん ー ら か わ か る

    て っ 言 何 Cloudflare が持つグローバル ネットワーク(CDN)上で動く エッジコンピューティング インフラ自体の設定も保守も基 本不要で理論上無制限にスケー リングするサーバーレス基盤 無料から利用可能で100万件の リクエストあたり0.3 USD
  2. CDN とは? Content Delivery Network の略で、コンテンツを効率よ く配信するためのネットワークのこと。 サーバー (Origin) と

    クライアントの間に立って、キャッ シュやネットワークの最適化をしてくれる AkamaiやFastly などの会社も同様の仕組みを提供している AWS で言うと CloudFront
  3. CDN とは? Japan Japan America クライアント エッジサーバー
 (CDN) サーバー
 (Origin)

    CDNが間に立って静的なコンテンツを キャッシュしてくれるので体感早くなる
  4. CDN とは? Japan Japan America エッジサーバー
 (CDN) サーバー
 (Origin) IP

    Anycast クライアント Cloudflareの場合は、DNS とくっついて提供されている かつTLS 終端を行うReverse Proxy としての役目がある
  5. Cloudflare Workersの仕組み Workers の根幹は JavaScript エンジンである V8 にある Isolate という仕組みによって動いている

    V8 はブラウザにも Node.js にも使われて居る isolateの仕組みと、外側のSandbox環境によってセキュリ ティ的に守られている 要するに JavaScript が Chromium で使われている JavaScript エンジンの上で動いている
  6. isolate アプローチでは、一度 作り出した JavaScript Runtime から isolate を何千 個と作り出してユーザーコード を実行できる

    コールドスタートな 実際のコードの どの実行時に支払う 実行領域 オーバーヘッド
  7. Cloudflare Workersの仕組み Workers の根幹は JavaScript エンジンである V8 にある Isolate という仕組みによって動いている

    V8 はブラウザにも Node.js にも使われて居る isolateの仕組みと、外側のSandbox環境によってセキュリ ティ的に守られている 要するに JavaScript が Chromium で使われている JavaScript エンジンの上で動いている
  8. ! い な は 話 い ま う に な

    ん そ最高のサービス見つけちまったぜ!
  9. Cloudflare Developer Platform AI Analytics Engine Assets Browser Rendering D1

    Durable Objects Hyperdrive Images KV Queues R2 Rate Limiting Service Bindings Tail Workers Vectorize Workflows
  10. Cloudflare Developer Platform AI Analytics Engine Assets Browser Rendering D1

    Durable Objects Hyperdrive Images KV Queues R2 Rate Limiting Service Bindings Tail Workers Vectorize Workflows
  11. KV グローバルで低レイテンシな Key-Value データストア 書き込み時は集中型のデータセンターにデータを保存する & エッジにキャッシュを保管する or Purgeする 読み込み時はエッジにキャッシュがあればそれを、無けれ

    ば集中型のデータセンターにデータを取得しに行く 各エッジでは結果整合性を持っているが、他のエッジに伝搬 するまでに60秒以上かかることがある AWS だと DynamoDB Global Table みたいなもの
  12. Durable Object グローバルで一意な状態・ストレージを持つ低レイテンシな Workers と Storage を組み合わせたもの ステートフルなサーバーレスアプリケーションをつくるのに利 用することができる。 WebSocket

    の Connection を持っておいたり、ユーザー セッションを持っておく場合などに利用できる。 KVと異なり強力な一貫性を持ち、JSのObjectを持つことが 出来る。
  13. Hyperdriveがある場合 10ms 300ms TCP Handshake Authorization Request Handle! Query Request

    Request Handle! Query Request Query Result Hyperdrive Cache HIt! Hyperdrive Cache Miss Query Request
  14. Hyperdriveがある場合 10ms 300ms TCP Handshake Authorization Request Handle! Query Request

    Request Handle! Query Request Query Result Hyperdrive Cache HIt! リクエストがくる前 or 来たタイミングで コネクションプールを用意する Hyperdrive Cache Miss Query Request
  15. Hyperdriveがある場合 10ms 300ms TCP Handshake Authorization クエリキャッシュが存在すれば、それを返す Request Handle! Query

    Request Hyperdrive Cache HIt! Request Handle! Query Result Query Request Hyperdrive Cache Miss Query Request
  16. Hyperdriveがある場合 10ms 300ms TCP Handshake Authorization Request Handle! Request Handle!

    Query Result Query Request Query Request Hyperdrive Cache HIt! クエリキャッシュが存在しなければ、 DBにリクエストしてそれを返す Hyperdrive Cache Miss Query Request
  17. Hyperdriveがない時のPros / Cons Cons Workers <-> Hyperdrive 、 Hyperdrive <->

    DB の2つ のネットワークリクエストになるため、初回以外のネット ワークレイテンシは若干増加することがある Hyperdriveがキャッシュするため、キャッシュの挙動に悩ま されることがあるかも
  18. Hyperdriveを実際に使ってみよう 1 // wrangler.jsonc 2 { 3 ... 4 "hyperdrive":

    [ 5 { 6 "binding": "HYPERDRIVE_DB", 7 "id": "039de7c44d4b45fab171c85ba68aba38" 8 } 9 ], 10 ... 11 }
  19. Hyperdriveを実際に使ってみよう 1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 16 import { Hono } from 'hono'; import { drizzle } from 'drizzle-orm/postgres-js'; /* type CloudflareBindings = { HYPERDRIVE_DB: Hyperdrive } */ const app = new Hono<{ Bindings: CloudflareBindings }>(); app.use('*', (c, next) => { const db = drizzle(c.env.HYPERDRIVE_DB.connectionString); c.set('db', db); return next(); });
  20. Hyperdriveを実際に使ってみよう 1 app.get('/account/me', async (c) => { 2 const db

    = c.get('db') 3 const userId = "nekoyasan" // 実際にはどこかで送っている 4 if (!db) throw new Error('Database connection not found in context'); 5 6 const userData = await db.select({ 7 id: userDetail.userId, 8 displayName: userDetail.displayName, 9 iconImage: userDetail.iconImage, 10 }) 11 .from(userDetail) 12 .where(eq(userDetail.userId, userId)); 13 14 return c.json({ result: userData[0] }) 15 })