Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Cloudflare Workersと状態管理
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
chimame
January 24, 2023
Programming
2.1k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cloudflare Workersと状態管理
Serverless Frontend Meetup #1 「Cloudflare Workers」
chimame
January 24, 2023
More Decks by chimame
See All by chimame
知って得する@cloudflare_vite-pluginのあれこれ
chimame
2
560
Boost Your Web Performance with Hyperdrive
chimame
1
500
RemixでVersion skewに立ち向かう
chimame
2
1.3k
私がエッジを使う理由
chimame
10
4.1k
GraphQL Server on Edge after that
chimame
1
1.7k
Accelerating App Dev with Cloudflare Workers
chimame
1
490
GraphQL Server on Edge
chimame
12
6.4k
エッジで輝くフロントエンド
chimame
11
6.9k
CSRなサイトを (疑似的な)ISRに変更した話
chimame
0
710
Other Decks in Programming
See All in Programming
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
500
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
200
JavaDoc 再入門
nagise
0
290
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
120
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
550
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
760
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
310
Agentic UI
manfredsteyer
PRO
0
110
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.1k
AI時代のUIはどこへ行く?その2!
yusukebe
19
6.7k
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
3.5k
Spec-Driven Development with AI-Agents: From High-Level Requirements to Working Software
antonarhipov
2
470
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
The Spectacular Lies of Maps
axbom
PRO
1
790
WCS-LA-2024
lcolladotor
0
620
Embracing the Ebb and Flow
colly
88
5.1k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Six Lessons from altMBA
skipperchong
29
4.3k
Rails Girls Zürich Keynote
gr2m
96
14k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
550
Balancing Empowerment & Direction
lara
6
1.1k
BBQ
matthewcrist
89
10k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
200
Transcript
Cloudflare Workesと状態管理 Serverless Frontend Meetup #1 2023.01.24
目次 • 自己紹介 • Cloudflare Workersの特徴 • 状態管理 • アーキテクチャ(使用例)
• コードサンプル • まとめ
自己紹介 • name: chimame / rito • job: Webエンジニア •
field: Cloudflare, GCP, AWS, Ruby, Node.js, TypeScript, React, Next.js, Remix, Docker etc • company: Goens株式会社( https://about.goen-s.com ) • twitter: @chimame_rt • GitHub: chimame
サービス 50歳以上限定のマッチングアプリ Goens「ゴエンズ」 単身限定で安心。同世代だから話が合う。シンプルかつ 便利。Goens(ゴエンズ)は、心を開き合えるパートナー をじっくり見つけられる、シニア向け恋活・婚活マッチング アプリです。
Cloudflare Workersの特徴 • エッジサーバで実行される ◦ サーバレス実行環境 • JavaScript, Rust, Cなどの幾つかの言語で作成することが可能
• リクエストとレスポンスのハンドリングに特化して処理を作成することが可能 ◦ 例えばロードバランサー的なことも出来る ブラウザからのリクエストをサーバ(オリジン)で処理する前に、処理をする
アプリケーションはプログラムさえ動く環境があ れば大丈夫?
大抵の場合はそうではない
アプリケーションに必要なもの • システムリソース(CPU、メモリなど) • プログラム • データ • インターフェース(httpやhtmlなど) データとはアプリケーションやユーザがどういう状態であるかというものを指す。雑に書
けばデータベースとほぼ同義(データベースだけでないが)。 この中で、唯一Cloudflare Workersが提供していないのがデータ。これはCloudflare Workersではなく、サーバレスがスケーラビリティであるため状態(=データ)を保持でき ないのが理由。
状態管理 Cloudflare Workersで行う状態管理の手法 • Cache API • Cloudflare KV •
Durable Objects • D1 ※Alpha版 • R2
状態管理 Cloudflare Workersで行う状態管理の手法 • Cache API • Cloudflare KV •
Durable Objects • D1 ※Alpha版 • R2 結果整合性 強整合性
状態管理 Cloudflare Workersで行う状態管理の手法 • Cache API • Cloudflare KV •
Durable Objects • D1 ※Alpha版 • R2 レスポンスをキャッシュする。 オリジンからもらったレスポンスを一定時間などの条件によっ てキャッシュしたものをクライアントに返すことで、レスポンス を素早く返す。 アプリケーションの”状態”を一定同じものを返すという意味で 含めている。
状態管理 Cloudflare Workersで行う状態管理の手法 • Cache API • Cloudflare KV •
Durable Objects • D1 ※Alpha版 • R2 データをKey, Value形式で保存するストレージ。 保存するデータのKeyを柔軟に設定できること、保存する ValueもJSONを指定できたりと、Cache APIより柔軟性と強整 合性が高い。
状態管理 Cloudflare Workersで行う状態管理の手法 • Cache API • Cloudflare KV •
Durable Objects • D1 ※Alpha版 • R2 ストレージというよりメモリを永続化する。 メモリ上に情報を保持し、それをキャッシュとして返す場合、プ ロセス間ではそのメモリ情報は共有されない。なのでキャッ シュとしての機構としては貧弱となるが、この Durable Objectsを使用することでメモリ上に保存した情報を共有する と同時に、永続化する。
状態管理 Cloudflare Workersで行う状態管理の手法 • Cache API • Cloudflare KV •
Durable Objects • D1 ※Alpha版 • R2 昨年Alpha版が公開されたエッジ上で動作する SQLite。 SQLiteなので通常のデータベース同様に、 Cloudflare Workers上のプログラムから SQLを投げることでデータの取 得や保存、更新が行うことが可能。 また、エッジに展開された SQLiteなのでデータが共有される。 Alpha版であるがゆえにトランザクションなどの処理に課題を 残すが大きく期待されているサービスの 1つ
状態管理 Cloudflare Workersで行う状態管理の手法 • Cache API • Cloudflare KV •
Durable Objects • D1 ※Alpha版 • R2 完全な外部ストレージであり、他の 4つのサービスとは少し異 なる。 ストレージのため、データの種類はストレージに保存する形式 であればなんでも可能。例えば画像や JavaScriptやHTMLな どの静的ファイル、もちろん動画ファイルなども可能。 Beta版時はCloudflare Workers経由でしか配信が行えな かったが、今ではドメインを紐づけて直接配信することが可 能。
※管理画面 サービスアーキテクチャ Cloudflare Workers Durable Objects Authentication Cloud Messaging Crashlytics
etc 認証 画像データ Socket通信 ユーザデータ (GraphQL) PUSH通知
※管理画面 Authentication Cloud Messaging Crashlytics etc 認証 画像データ ユーザデータ (GraphQL)
Cloudflare Workers Durable Objects サービスアーキテクチャ Socket通信 複数の端末が同時にWeb Socketにて 接続を行うため、接続情報をメモリ (=Durable Objects)上に保持する PUSH通知
※管理画面 Authentication Cloud Messaging Crashlytics etc 認証 画像データ ユーザデータ (GraphQL)
Cloudflare Workers Durable Objects サービスアーキテクチャ Socket通信 メモリ(=Durable Objects)上に保持す る接続情報から該当端末を特定して、 サーバPushを行う。 PUSH通知
コード(全体感) export class Socket { sessions: Session = {} app:
Hono<Bindings> = new Hono<Bindings>() // サーバから指定の繋ぎ先にPublishするエンドポイント this.app.post('/publish/:id', async (ctx) => {}) // クライアントからSubscribeするエンドポイント this.app.get('/subscribe/:id', async (ctx) => {}) // Cloudflare Workerがリクエストを処理するためのメソッド async fetch(request: Request) { return await this.app.fetch(request) } } https://github.com/cloudflare/workers-chat-demo
コード(Subscribe) sessions: Session = {} // 接続しているクライアント情報を保持する // クライアントからSubscribeするエンドポイント this.app.get('/subscribe/:id',
async (ctx) => { // <ここに何らかの認証を入れた方がよい(例えば JWT認証)> const id = ctx.req.param('id') const [client, server] = Object.values(new WebSocketPair()) server.accept() this.sessions[id] = server return new Response('', { status: 101, webSocket: client, }) })
コード(Publish) sessions: Session = {} // サーバから指定の繋ぎ先にPublishするエンドポイント this.app.post('/publish/:id', async (ctx)
=> { // <ここに何らかの認証を入れた方がよい> const id = ctx.req.param('id') const payload = await ctx.req.text() const session = this.sessions[id] if (session) { session.send( typeof payload === 'string' ? payload : JSON.stringify(payload) ) } })
コード(使用例) // クライアント const socket = new WebSocket( ‘https://<domain>/subscribe/<chatId>’ )
socket.onmessage = (e) => { console.log('onMessage!') // JSON.parse(e.data) で何らかの処理 } // サーバ import axios from 'axios' const body = { test: ‘hoge’ } await axios.post(‘https://<domain>/publish/<chatId>’, body)
まとめ • Cloudflare Workersで行う状態管理の手法はいくつかある • プログラム処理や特性によって最適なものを選ぶ • Durable Objectsについてはこちらに目を通すと理解が深まる ◦
https://developers.cloudflare.com/workers/learning/using-durable-objects/ ◦ https://github.com/cloudflare/workers-chat-demo
Thanks ご清聴ありがとうございました。 https://about.goen-s.com/