A legjobb hír az egész tanfolyamban: az Aurora Postgresedet nem kell lecserélned. Ez a modul arról szól, miért probléma a hagyományos adatbázis az edge-ről nézve — és hogyan oldja meg ezt a Hyperdrive úgy, hogy a kódod szinte változatlan marad.
Beanstalkon a Node-processzeid a DB mellett élnek, és induláskor felhúznak egy connection poolt, ami órákig szolgál. Az edge-en ez a modell kétszeresen törik el:
max_connections-ét.Ez ugyanaz a problémakör, amiért az AWS-en Lambda + RDS mellé RDS Proxyt tettél volna. A Cloudflare válasza a Hyperdrive — ugyanez a szerep, de globálisan elosztva és query cache-sel megfejelve.
max_age-ig cache-eli az edge-en. A slágerlekérdezéseid el sem jutnak az Auroráig.1. Hozd létre a Hyperdrive-konfigot a meglévő connection stringeddel (ez a Cloudflare-nél tárolódik, nem a kódodban):
npx wrangler hyperdrive create my-aurora \
--connection-string="postgres://user:pass@my-cluster.eu-central-1.rds.amazonaws.com:5432/app"
2. Kösd be a Workeredbe (és mivel a Postgres-driverek Node API-kra épülnek, kell a nodejs_compat — 2. modul):
{
"compatibility_flags": ["nodejs_compat"],
"hyperdrive": [
{ "binding": "HYPERDRIVE", "id": "<CONFIG_ID>" }
]
}
3. Használd a megszokott drivereddel. A binding egy generált connection stringet ad — a drivered azt hiszi, egy sima Postgreshez beszél:
server/api/products.get.ts (Nuxt) vagy src/index.tsimport postgres from "postgres"; // vagy node-postgres, Drizzle, Kysely…
export default defineEventHandler(async (event) => {
const { env } = event.context.cloudflare;
// FONTOS: a handler BELSEJÉBEN példányosíts, ne globálisan! (2. modul)
const sql = postgres(env.HYPERDRIVE.connectionString);
const products = await sql`SELECT id, name, price FROM products
WHERE active = true ORDER BY name`;
return products;
});
ORM-mel ugyanez: a Drizzle a node-postgres vagy postgres.js driver fölött ül, tehát a sémáid, query buildered, migrációs fájljaid maradnak. Lokális fejlesztésnél a WRANGLER_HYPERDRIVE_LOCAL_CONNECTION_STRING_HYPERDRIVE környezeti változóval a lokális/dev Postgresedre mutatsz — a kód nem változik.
placement.region beállítással ráadásul megmondhatod, hogy a Workered eleve a DB régiójában fusson (pl. "aws:eu-central-1") — több query-s kéréseknél ez sokat hoz.Beanstalkon egy kapcsolatot akár egy teljes kérésen át fogva tarthattál, session-szintű SET-ekkel. A Hyperdrive poolja tranzakció-módú: minden tranzakció után a kapcsolat visszamegy a poolba, és RESET-elődik. Következmények: session-szintű állapotra (temp táblák, session SET-ek, advisory lockok kérések között) nem építhetsz; a SET tranzakción vagy egy query-n belül él csak; és ne tarts hosszú tranzakciókat pusztán azért, hogy állapotot őrizz — az kizárja a kapcsolatot a pool elől. Named prepared statements a postgres.js és node-postgres driverrel támogatottak.
A Hyperdrive nem érvényteleníti a cache-elt read-eket, amikor írsz az adatbázisba — a cache a max_age lejártáig élhet (plusz stale_while_revalidate ablak). Egy INSERT utáni azonnali SELECT visszaadhatja a régi állapotot. A bevált minta: két Hyperdrive-konfig ugyanarra a DB-re — egy cache-elt a tömeges, staleness-tűrő read-eknek (katalógus, listák, dashboardok), és egy --caching-disabled a friss olvasást igénylő utaknak (auth, session, jogosultság, write-után-read):
npx wrangler hyperdrive create my-aurora-fresh \
--connection-string="postgres://…" --caching-disabled
használat
const sql = postgres(env.HYPERDRIVE.connectionString); // cache-elt
const sqlFresh = postgres(env.HYPERDRIVE_FRESH.connectionString); // mindig friss
const catalog = await sql`SELECT … FROM products`; // jöhet cache-ből
const user = await sqlFresh`SELECT … FROM sessions`; // soha nem stale
| RDS Proxy | Hyperdrive | |
|---|---|---|
| Elhelyezkedés | egy régióban, a VPC-ben | globális: setup az edge-en, pool a DB-nél |
| Query cache | nincs | van (read-ekre, konfigurálható) |
| Ár | óradíj vCPU-nként | a Workers Paid része, nincs külön óradíj |
| Kódváltozás | endpoint-csere | connection string a bindingból — ennyi |
| DB-támogatás | RDS/Aurora | bármilyen elérhető Postgres/MySQL (RDS, Aurora, Neon, Supabase, PlanetScale, on-prem Tunnelen át…) |
A stratégiai kép a migrációdhoz (10. modul előzetese): a Hyperdrive miatt az adatbázis-döntést szétválaszthatod az app-migrációtól. Első lépésben az app megy Workersre, az Aurora marad — működő, gyors setup. Hogy utána érdemes-e D1-re vagy másra váltani, az már ráér — erről szól a következő modul.
max_connections-ét, amikor a Beanstalk-appod sosem tette?
Beanstalkon néhány hosszú életű processz tart egy-egy poolt. Az edge-en több száz helyszínen ezernyi rövid életű isolate futhat, mindegyik saját kapcsolatot nyitna — a Hyperdrive központi, DB-melletti poolja fogja ezt össze véges számú valódi kapcsolatba.
Kapcsolat-setup az edge-en (a Worker mellett), meleg connection pool az origin DB mellett, és query cache a nem-mutáló lekérdezésekre.
A query cache nem invalidálódik írásra — a read a max_age-ig cache-ből jöhet. Megoldás: második, --caching-disabled Hyperdrive-konfig a friss olvasást igénylő utakra (auth, session, read-after-write), vagy alacsonyabb max_age.
Az isolate-ek jönnek-mennek és sokasodnak (2. modul): a globális kliens élettartama kiszámíthatatlan, kapcsolatok ragadhatnak be. A klienst a handleren belül hozod létre — a Hyperdrive edge-setupja miatt ez olcsó.
Kérések közt élő session SET-ek, temp táblák, session-szintű advisory lockok, prepared statementek megőrzése kapcsolat-szinten — a kapcsolat minden tranzakció után RESET-tel visszakerül a poolba. Amit be kell állítani, azt tranzakción belül tedd.