4. modulAdatbázis I: maradó Postgres + Hyperdrive
Cloudflare for Devs · 4. modul

Adatbázis I: maradó Postgres + Hyperdrive

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.

4.1A probléma: 300 város, egy adatbázis

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:

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.

4.2Hogyan működik a Hyperdrive?

Worker pl. Sydney PoP Hyperdrive @ edge ① kapcsolat-setup helyben ③ query cache (read-ek) cache hit → azonnali válasz Hyperdrive pool ② a DB mellett meleg kapcsolatok, tranzakció-mód Aurora eu-central-1 ~1 ms Cloudflare-gerinchálón ~1 ms A drága lépések (TLS-setup, pool) oda kerülnek, ahol olcsók: a setup a Workerhez, a pool a DB-hez közel.
4. ábra — A Hyperdrive három gyorsítása: ① kapcsolat-setup az edge-en, ② meleg connection pool a DB mellett, ③ query cache a leggyakoribb read-ekre.

4.3Beüzemelés: három lépés

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):

wrangler.jsonc
{
  "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.ts
import 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.

Aurora-specifikus teendő: a Hyperdrive-nak el kell érnie a DB-t. Vagy publikusan elérhetővé teszed az Aurorát (TLS + erős jelszó + a Hyperdrive IP-tartományaira szűkített security group / IP ACL), vagy — szebb megoldás — Cloudflare Tunnel-lel adsz privát utat a VPC-be. A 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.

4.4A két csapda, amit ismerned kell

1. Tranzakció-mód: a kapcsolat nem „a tiéd"

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.

2. Query cache: nincs write-invalidáció

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

4.5RDS Proxy vs. Hyperdrive — gyors összevetés

RDS ProxyHyperdrive
Elhelyezkedésegy régióban, a VPC-benglobális: setup az edge-en, pool a DB-nél
Query cachenincsvan (read-ekre, konfigurálható)
Áróradíj vCPU-nkénta Workers Paid része, nincs külön óradíj
Kódváltozásendpoint-csereconnection string a bindingból — ennyi
DB-támogatásRDS/Aurorabá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.

4.6Ellenőrizd magad

  1. Miért meríti ki pool nélkül egy edge-platform a Postgres max_connections-ét, amikor a Beanstalk-appod sosem tette?
    Válasz

    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.

  2. Mi a Hyperdrive három gyorsító mechanizmusa?
    Válasz

    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.

  3. Írás után azonnal olvasol, és néha régi adatot kapsz. Mi történik, és mi a megoldás?
    Válasz

    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.

  4. Miért hiba a Postgres-klienst a Worker globális scope-jában létrehozni?
    Válasz

    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ó.

  5. Milyen session-szintű Postgres-szokásaid törnek el a tranzakció-módú pooling miatt?
    Válasz

    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.

Előző3. modul — Full-stack és frontend: Nuxt a Workers-en Következő 5. modul — Adatbázis II: D1, a natív SQL-adatbázis