INTEGRITY Dokumentace

Umístění

Standardně Workers a Pages Functions se spouští v datovém centru nejblíže místu přijetí požadavku. Pokud váš Worker odesílá požadavky na backendovou infrastrukturu, jako jsou databáze nebo API, může být výkonnější provozovat tento Worker blíže backendu než koncovému uživateli.

{
	"placement": {
		// Use one of the following options (mutually exclusive):
		"mode": "smart", // Cloudflare automatically places your Worker closest to the upstream with the most requests
		"region": "gcp:us-east4", // Explicit cloud region to run your Worker closest to - e.g. "gcp:us-east4" or "aws:us-east-1"
		"host": "db.example.com:5432", // A host to probe (TCP/layer 4) - e.g. a database host - and place your Worker closest to
		"hostname": "api.example.com", // A hostname to probe (HTTP/layer 7) - e.g. an API endpoint - and place your Worker closest to
	},
}
[placement]
mode = "smart"
region = "gcp:us-east4"
host = "db.example.com:5432"
hostname = "api.example.com"

Umístění dokáže snížit celkovou latenci požadavku na Worker tím, že minimalizuje latenci zpáteční cesty požadavků mezi vaším Workerem a backendovými službami. Díky tomu lze dosáhnout latence v jednotkách milisekund k databázím, API a dalším službám běžícím ve starší cloudové infrastruktuře.

Možnost Vhodné pro Konfigurace
Smart Více backendových služeb nebo neznámá umístění infrastruktury mode = "smart"
Region Jediná backendová služba ve známém cloudovém regionu region
Host Jediná backendová služba mimo hlavní poskytovatele cloudu host nebo hostname

Seznamte se s umístěním

Představte si uživatele v australském Sydney, který přistupuje k aplikaci běžící na Workers. Tato aplikace provádí několik zpátečních cest k databázi v německém Frankfurtu.

Uživatel umístěný v Sydney, AU, se připojuje k Workeru ve stejném regionu, který následně provede několik cest tam a zpět k databázi umístěné ve Frankfurtu, DE.

Latence z opakovaných cest tam a zpět mezi Sydney a Frankfurtem se sčítá. Umístěním Workeru blíže databázi Cloudflare zkracuje celkovou dobu trvání požadavku.

Uživatel umístěný v Sydney, AU, se připojuje k Workeru ve Frankfurtu, DE, který následně provede několik cest tam a zpět k databázi umístěné rovněž ve Frankfurtu, DE.

Povolení Smart Placement

Smart Placement automaticky analyzuje vzorce provozu vašeho Workeru a umístí ho na optimální lokalitu. Smart Placement použijte, když:

Smart Placement se zapíná pro každý Worker zvlášť. Po zapnutí analyzuje doba trvání požadavku Workeru pravidelně v různých lokalitách Cloudflare.

U každé kandidátské lokality Smart Placement zohledňuje výkon Workeru a síťovou latenci přidanou přeposláním požadavku. Pokud je kandidátská lokalita výrazně rychlejší, požadavek se přepošle tam. V opačném případě Worker běží ve výchozí lokalitě nejbližší požadavku.

Smart Placement bere v úvahu pouze lokality, kde Worker již dříve běžel. Nemůže Worker umístit do lokality, která běžně nepřijímá provoz.

Prohlédněte si omezení

Povolit Smart Placement

Smart Placement je dostupný ve všech plánech Workers.

Nakonfigurujte pomocí Wrangleru

Přidejte následující do konfiguračního souboru Wrangler:

{
	"placement": {
		"mode": "smart",
	},
}
[placement]
mode = "smart"

Smart Placement může po nasazení analyzovat váš Worker až 15 minut.

Nastavení v dashboardu

  1. Přejděte na Workers & Pages.

    Přejděte na Workers & Pages ↗
  2. Vyberte svůj Worker.

  3. Přejděte na Nastavení > Obecné.

  4. V části Umístění, vyberte Smart.

Aby mohl Smart Placement rozhodnout o umístění, potřebuje stálý provoz na Worker z více lokalit. Proces analýzy může trvat až 15 minut.

Kontrola stavu umístění

Stav umístění svého Workeru zjistíte prostřednictvím Workers API:

curl -X GET https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/workers/services/$WORKER_NAME \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
-H "Content-Type: application/json" | jq .

Možné stavy umístění:

Stav Popis
(not present) Worker ještě nebyl analyzován. Běží ve výchozí lokalitě nejbližší požadavku.
SUCCESS Worker byl analyzován a bude optimalizován pomocí Smart Placement.
INSUFFICIENT_INVOCATIONS Worker zatím nedostal dostatek požadavků z více lokalit, aby bylo možné rozhodnout o umístění.
UNSUPPORTED_APPLICATION Smart Placement zpomalil Worker a umístění vrátil zpět. Tento stav je vzácný (méně než 1 % Workerů).

Prohlédněte si analýzu doby trvání požadavků

Jakmile povolíte Smart Placement, začnou se sbírat údaje o době trvání požadavků. Doba trvání požadavku se měří v datovém centru nejbližším koncovému uživateli. Ve výchozím nastavení se 1 % požadavků nesměruje pomocí Smart Placement, aby sloužily jako výchozí základ pro srovnání.

Zobrazit u vašeho Workeru analytika doby trvání požadavků k měření dopadu Smart Placement.

Zkontrolujte cf-placement hlavička

Cloudflare přidává cf-placement hlavičku ke všem požadavkům, když je umístění povoleno. Pomocí této hlavičky zjistíte, zda byl požadavek směrován pomocí Smart Placement a kde Worker požadavek zpracoval.

Hodnota hlavičky obsahuje typ umístění a kód letiště označující umístění datacentra:

Nakonfigurujte explicitní Placement Hints

Nápovědy pro umístění vám umožňují explicitně určit, kde váš Worker běží. Použijte nápovědy pro umístění, pokud:

Mezi příklady patří primární databáze, virtuální stroj nebo klastr Kubernetes v konkrétní oblasti. Snížení obousměrné latence z 20 až 30 milisekund na dotaz na 1 až 3 milisekundy zlepšuje dobu odezvy.

Zadejte cloudový region

Pokud vaše infrastruktura běží v AWS, GCP nebo Azure, nastavte placement.region vlastnost pomocí formátu {provider}:{region}:

{
	"placement": {
		"region": "aws:us-east-1", // Explicit cloud region to run your Worker closest to - e.g. "gcp:us-east4" or "aws:us-east-1"
	},
}
[placement]
region = "aws:us-east-1"

Cloudflare namapuje vámi zadaný cloudový region na datacentrum s nejnižší latencí k tomuto regionu. Cloudflare automaticky upravuje umístění s ohledem na údržbu sítě nebo změny, takže nemusíte zadávat záložní (failover) regiony.

Zadejte koncový bod hostitele

Pokud vaše infrastruktura neběží u žádného z hlavních poskytovatelů cloudu, můžete zadat koncový bod, který Cloudflare otestuje. Cloudflare podle něj odhadne polohu vašeho externího hostitele a umístí Workers do nejbližšího regionu.

Nastavte placement.host k identifikaci služby vrstvy 4. Cloudflare měří latenci pomocí kontrol TCP CONNECT a vybírá nejvhodnější datacentrum.

{
	"placement": {
		"host": "my_database_host.com:5432", // A host to probe (TCP/layer 4) - e.g. a database host - and place your Worker closest to
	},
}
[placement]
host = "my_database_host.com:5432"

Nastavte placement.hostname k identifikaci služby vrstvy 7. Cloudflare měří latenci pomocí kontrol HTTP HEAD a vybírá nejvhodnější datacentrum.

{
	"placement": {
		"hostname": "my_api_server.com", // A hostname to probe (HTTP/layer 7) - e.g. an API endpoint - and place your Worker closest to
	},
}
[placement]
hostname = "my_api_server.com"

Sondy se odesílají z veřejných rozsahů IP adres, nikoli z rozsahů IP adres Cloudflare. Cloudflare v pravidelných intervalech znovu ověřuje umístění služby. Tyto sondy lokalizují prostředky s jediným připojením a u broadcastových, anycastových, multicastových nebo replikovaných prostředků nefungují správně.

Vypsat podporované regiony

Nápovědy pro umístění podporují identifikátory oblastí Amazon Web Services (AWS), Google Cloud Platform (GCP) a Microsoft Azure:

Poskytovatel Formát Příklady
AWS aws:{region} aws:us-east-1, aws:us-west-2, aws:eu-central-1
GCP gcp:{region} gcp:us-east4, gcp:europe-west1, gcp:asia-east1
Azure azure:{region} azure:westeurope, azure:eastus, azure:southeastasia

Úplný seznam kódů regionů najdete v Regiony AWS, Regiony GCP, nebo Oblasti Azure.

Chování umístění

Umístění Workers se chová podobně bez ohledu na to, zda používáte Smart Placement, nebo Placement Hints. Následující chování platí pro obě možnosti.

Prohlédněte si omezení

Následující omezení platí jak pro Smart Placement, tak pro Placement Hints:

cf-placement hlavička

Cloudflare přidává cf-placement hlavičku ke všem požadavkům, pokud je aktivní umístění (placement). Pomocí této hlavičky zjistíte, zda byl požadavek směrován s využitím umístění a kde ho Worker zpracoval.

Hodnota hlavičky obsahuje typ umístění a kód letiště označující umístění datacentra:

Více Workers

Pokud na Workers vytváříte full-stack aplikace, rozdělte edge logiku (autentizace, routing) a back-end logiku (databázové dotazy, volání API) do samostatných Workers. Použijte Service Bindings pro jejich propojení pomocí typově bezpečného RPC.

Smart Placement a Service Bindings

Povolte umístění pro backendový Worker, aby se spouštěl blízko vaší databáze, zatímco edge Worker bude řešit ověřování blízko uživatele.

Příklad: edge autentizace s umístěným backendem

Tento příklad ukazuje dva Workery:

{
	"name": "auth-worker",
	"main": "src/index.ts",
	"services": [{ "binding": "APP", "service": "app-worker" }],
}
name = "auth-worker"
main = "src/index.ts"

[[services]]
binding = "APP"
service = "app-worker"
auth-worker/src/index.ts
import { AppWorker } from "../app-worker/src/index";

interface Env {
	APP: Service<AppWorker>;
}

export default {
	async fetch(request: Request, env: Env): Promise<Response> {
		const authHeader = request.headers.get("Authorization");
		if (!authHeader?.startsWith("Bearer ")) {
			return new Response("Unauthorized", { status: 401 });
		}

		const userId = await validateToken(authHeader.slice(7));
		if (!userId) {
			return new Response("Invalid token", { status: 403 });
		}

		// Call the placed back-end Worker via RPC
		const data = await env.APP.getUser(userId);
		return Response.json(data);
	},
};

async function validateToken(token: string): Promise<string | null> {
	return token === "valid" ? "user-123" : null;
}
{
	"name": "app-worker",
	"main": "src/index.ts",
	"placement": {
		// Use one of the following options (mutually exclusive):
		// "mode": "smart", // Cloudflare automatically places your Worker closest to the upstream with the most requests
		"region": "aws:us-east-1", // Explicit cloud region to run your Worker closest to - e.g. "gcp:us-east4" or "aws:us-east-1"
		// "host": "db.example.com:5432", // A host to probe (TCP/layer 4) - e.g. a database host - and place your Worker closest to
		// "hostname": "api.example.com", // A hostname to probe (HTTP/layer 7) - e.g. an API endpoint - and place your Worker closest to
	},
}
name = "app-worker"
main = "src/index.ts"

[placement]
region = "aws:us-east-1"
app-worker/src/index.ts
import { WorkerEntrypoint } from "cloudflare:workers";

export default class AppWorker extends WorkerEntrypoint {
	async fetch() {
		return new Response(null, { status: 404 });
	}

	// Each method runs near your database - multiple queries stay fast
	async getUser(userId: string) {
		const user = await this.env.DB.prepare("SELECT * FROM users WHERE id = ?")
			.bind(userId)
			.first();
		return user;
	}

	async getUserListings(userId: string) {
		// Multiple round-trips to the DB are low-latency when placed nearby
		const user = await this.env.DB.prepare("SELECT * FROM users WHERE id = ?")
			.bind(userId)
			.first();
		const listings = await this.env.DB.prepare(
			"SELECT * FROM listings WHERE owner_id = ?",
		)
			.bind(userId)
			.all();
		const reviews = await this.env.DB.prepare(
			"SELECT * FROM reviews WHERE listing_id IN (SELECT id FROM listings WHERE owner_id = ?)",
		)
			.bind(userId)
			.all();

		return { user, listings: listings.results, reviews: reviews.results };
	}
}

auth-worker se spouští na okraji sítě, aby rychle odmítl neautorizované požadavky. Ověřené požadavky se předávají přes RPC do app-worker, který běží v blízkosti vaší databáze pro rychlé dotazy.

Durable Objects

Durable Objects poskytují automatické umístění bez nutnosti konfigurace. Dotazy na vestavěnou databáze SQLite jsou fakticky s nulovou latencí protože výpočet běží ve stejném procesu jako data.

Proveďte co nejvíce práce přímo uvnitř Durable Object a vraťte souhrnný výsledek, místo abyste z Workeru posílali několik samostatných požadavků:

src/index.ts
import { DurableObject } from "cloudflare:workers";

type Session = { id: string; user_id: string; created_at: number };
type PromptHistory = {
	id: string;
	session_id: string;
	role: string;
	content: string;
};

export class AgentHistory extends DurableObject {
	async getSessionContext(sessionId: string) {
		// All queries execute with zero network latency — compute and data are colocated
		const session = this.ctx.storage.sql
			.exec<Session>("SELECT * FROM sessions WHERE id = ?", sessionId)
			.one();
		const prompts = this.ctx.storage.sql
			.exec<PromptHistory>(
				"SELECT * FROM prompt_history WHERE session_id = ? ORDER BY created_at",
				sessionId,
			)
			.toArray();

		return { session, prompts };
	}
}