edge-computing について
エッジでのアプリケーション開発に取り組む開発者向けのリファレンススキルです。ランタイムやデータストアの比較に加え、プラットフォームの制約と一般的な設計パターンを扱います。
主な機能
- 01ランタイムとプラットフォームの比較
- 02エッジデータベースの選択肢
- 03レンダリング、ルーティング、キャッシュのパターン
- 04レート制限と A/B テスト
- 05ランタイム制約とデータベースの指針
活用シーン
- 01アプリケーションのエッジランタイム選定
- 02エッジ処理向けデータベースの選定
- 03地域別ルーティングとキャッシュの設計
- 04デプロイ前のランタイム制約の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ travisjneuman/ .claude --skill edge-computingインストール後、Claude Code で/edge-computingを入力して読み込まれたか確認します。
詳細
エッジコンピューティング
プラットフォーム
| プラットフォーム | ランタイム | コールドスタート | 制限 |
|---|---|---|---|
| Cloudflare Workers | V8 isolates | 約0ms | 128MB、CPU 30秒 |
| Deno Deploy | V8 isolates | 約0ms | 512MB、CPU 50ms |
| Vercel Edge Functions | V8 isolates | 約0ms | 128MB、25秒 |
| AWS Lambda@Edge | Node.js | 約100ms | 128MB、5秒(ビューワー) |
| Bun | JavaScriptCore | 該当なし(サーバー) | 固定の制限なし |
Cloudflare Workers
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
// KV storage
const cached = await env.KV.get(url.pathname);
if (cached) return new Response(cached, { headers: { 'Cache-Control': 'max-age=60' } });
// D1 database
const { results } = await env.DB.prepare('SELECT * FROM users WHERE id = ?')
.bind(url.searchParams.get('id'))
.all();
// Durable Objects for state
const id = env.COUNTER.idFromName('global');
const obj = env.COUNTER.get(id);
const count = await obj.fetch(request);
return new Response(JSON.stringify(results));
}
};
エッジデータベース
| データベース | 種類 | 最適な用途 |
|---|---|---|
| Cloudflare D1 | SQLite | Workers ネイティブ、エッジでの SQL |
| Turso | libSQL(SQLite) | マルチリージョンレプリカ、組み込み |
| Cloudflare KV | キー値 | シンプルなキャッシュ、設定 |
| Durable Objects | ステートフル | リアルタイム処理、調整、カウンター |
| Upstash Redis | Redis | レート制限、エッジでのセッション管理 |
Deno Deploy
Deno.serve(async (req: Request) => {
const kv = await Deno.openKv();
const url = new URL(req.url);
if (req.method === "POST") {
const body = await req.json();
await kv.set(["items", crypto.randomUUID()], body);
return new Response("Created", { status: 201 });
}
const entries = kv.list({ prefix: ["items"] });
const items = [];
for await (const entry of entries) items.push(entry.value);
return Response.json(items);
});
パターン
- エッジサイドレンダリング: グローバルに TTFB を 50ms 未満にするエッジでの SSR
- スマートルーティング:
request.cf.countryに基づく、地域を考慮したリクエストルーティング - エッジキャッシュ: 細かな制御や stale-while-revalidate には Cache API を使用
- レート制限: Durable Objects または Upstash を使ったスライディングウィンドウカウンター
- A/B テスト: オリジンへの往復なしでエッジ側の機能フラグを使用
- 画像最適化: エッジでのオンザフライ変換(Cloudflare Images、Imgproxy)
制約と注意点
- V8 isolate ランタイムでは Node.js API(fs、net など)は使用できません
- ネイティブモジュールやバイナリは使用できません(計算負荷の高い処理には WASM を使用してください)
- リクエストごとの CPU 時間には上限があります。負荷の高い処理はキューにオフロードしてください
- isolate のコールドスタートはほぼゼロですが、Lambda@Edge では実際に発生します
- データベース接続には TCP 接続プールではなく、HTTP ベースのクライアントを使用してください
コメント
Markdown 対応