Closed5

Durable Objectsの作成場所を追跡する「Where Durable Objects Live」を軽く調査

slowhandslowhand

概要

Cloudflare の Durable Objects が作られた場所を追跡してくれる👇のサービスがどんな風になっているのか気になったので調査した際の記事になります。

https://where.durableobjects.live/

slowhandslowhand

Where Durable Objects Live の見方

colo

例えば以下のページに行くと

https://where.durableobjects.live/colo/FUK

以下の様なページが表示されます。

もし福岡からのアクセスでDurable Objectsを作成する場合、まず福岡の colo はDurable Objectsをホストしていないので近くの別の場所で作成されます。

colo とは…?
ある都市の地理的エリアにある1つ(または複数)のデータセンターのこと。LHR(ロンドン)やDEL(ニューデリー)のように、3文字のIATAコードで指定される

👆をみると NRT(千葉成田)かICN(韓国ソウル)のどちらかで作成されるらしく、NRTで作成される可能性が 75% となっている様です。

slowhandslowhand

Jurisdictions

https://where.durableobjects.live/jurisdiction

管轄区域は、特定の法域で永続オブジェクトを生成する方法です。これは、データが法的要件に従って保存されていることを確認するのに役立ちます。

Durable Objects では、jurisdiction パラメータを指定することで「どの法域(リーガル・リージョン)だけでオブジェクトを生成・保存・実行するか」を制御することができます。

管轄区域は以下の2に存在します。

  1. European Union
    • Durable Object が EU 域内の Cloudflare データセンターだけ で生成・実行・データ保存されるよう制限する
    • 背景としてはGDPR
  2. FedRAMP
    • FedRAMPFederal Risk and Authorization Management Program。米国政府のクラウド導入を促進するため、300 項目超の統一セキュリティ管理策を定義し、プロバイダーを認証する制度
    • Durable Object が FedRAMP Moderate 認定を受けた Cloudflare データセンターのみ で生成・実行・保存される
slowhandslowhand

Regions

https://where.durableobjects.live/region

リージョンは、特定の地理的位置に耐久性オブジェクトを生成する方法です。これは、特定のエリアのユーザーのレイテンシを削減するのに役立ちます。

とあります。これは

https://developers.cloudflare.com/durable-objects/reference/data-location/#provide-a-location-hint

上記に記載があるように、デフォルトではDurable Objectsは最初にアクセスがあった場所に近いデータセンターでインスタンス化されます。頻繁にアクセスされる場所でインスタンス化されたら良いですが、遠い場所でインスタンス化されてしまう可能性もあります。そうなるとレイテンシが高くなる可能性もあります。

そこで、Durable Objects では locationHint というオプションパラメータでインスタンス化する場所を指定する事ができます。これはベストエフォートであり必ず指定した場所でインスタンス化されるものではなく、指定場所からのレイテンシを最小限に抑えるように選択された場所でインスタンス化されます。

サポートされている場所

locationHintに設定する値 場所
wnam Western North America
enam Eastern North America
sam South America
weur Western Europe
eeur Eastern Europe
apac Asia-Pacific
oc Oceania
afr Africa
me Middle East
slowhandslowhand

リポジトリ

https://github.com/helloimalastair/where-durableobjects-live

monorepoになっていて packages の方は **IATAコード** や 定数定義や型定義などが含まれている様です。IATAコードはOurAirportsのオープンデータを使っている様です。

OurAirportsとは?
世界規模のオープンデータ航空場データベースで、現在 約 8 万3 000 超の空港レコードを収録し毎日自動更新されています

apps/worker

次に Cloudflare Workersの実装を見ていこうと思います。

  • wrangler.json

    • 使っているBindingは以下
      • KV
      • Durable Objects
      • Workers Analytics Engine
    • また **Cron Triggers** で定期実行
  • DurableObjectの処理

    import { DurableObject } from "cloudflare:workers";
    
    export class DO extends DurableObject {
    	async fetch() {
    		return Response.json({
    			ts: Date.now(),
    			colo: ((
    				await (await fetch("https://www.cloudflare.com/cdn-cgi/trace")).text()
    			).match(/^colo=(.+)/m) as string[])[1]
    		});
    	}
    }
    
    • /cdn-cgi/trace にアクセスしてDurableObjectが動いている colo の情報を返している様です。
  • Cron Triggersでの定期実行

    • apps/worker/src/cron/index.ts

      const cron: ExportedHandlerScheduledHandler<Env> = async (event, env, ctx) => {
      	const data = await Promise.all([colo(env), frontpage(env), status(env), regions(env), jurisdiction(env)]);
      	const live = {
      		colo: data[0],
      		frontpage: data[1],
      		status: data[2].status,
      		iata: data[2].iata,
      		region: data[3],
      		jurisdiction: data[4],
      		updatedAt: Date.now(),
      	} as LiveKV;
      	await Promise.all([env.KV.put("live", JSON.stringify(live)),
      		api(live, env)
      	]);
      };
      

      以下の処理結果の情報を KVapi に渡している様です

このスクラップは26日前にクローズされました