Indexul jurnaluluiDockup / notă de teren
Note / redis-cache-and-queue

Workload-uri de cache și cozi Redis pe Dockup

Modele pentru cache și cozi Redis pe Dockup: configurați Redis gestionat, conectați-l privat, definiți comportamentul la erori, evitați presupunerile privind pierderea datelor și monitorizați utilizarea.

Workload-urile de cache și coadă Redis pot folosi același serviciu Redis gestionat, dar au cerințe diferite de corectitudine. Un cache poate fi, de regulă, reconstruit după o pierdere. O coadă poate reprezenta lucrări care nu trebuie eliminate în tăcere sau procesate de două ori.

Dockup configurează Redis ca bază de date gestionată, oferă operațiuni pentru dimensiune și loguri, acceptă fluxuri de lucru pentru backup și migrarea nodurilor și poate conecta baza de date la serviciile aplicației prin rețelistică privată la nivel de proiect.

Cum configurați Redis gestionat?

Creați Redis în workspace-ul selectat:

dockup db create \
  --name app-redis \
  --type redis \
  --json

Confirmați ținta bazei de date:

dockup db list --json

Stocați datele de conectare returnate în afara controlului versiunilor și atașați-le serviciului consumator ca secret:

dockup env set REDIS_URL="$REDIS_URL" \
  --secret \
  -s production/api \
  --json

dockup deploy production/api --wait --json

Redeploy-ul creează un container nou al aplicației, cu mediul actualizat. Repornirea containerului vechi nu aplică o valoare dorită stocată ulterior.

Folosiți baze de date sau instanțe Redis separate atunci când comportamentul de eviction al cache-ului și retenția unei cozi critice nu ar trebui să concureze pentru aceeași memorie. Izolarea simplifică și diagnosticarea incidentelor, precum și controlul accesului.

Când ar trebui folosit Redis ca cache?

Un cache reduce munca repetată sau latența prin stocarea datelor derivate. Sursa de adevăr rămâne în altă parte, de obicei în PostgreSQL, MySQL, MongoDB, într-un API extern sau într-un calcul determinist.

Un design solid pentru cache definește:

  • Formatul cheii de cache și namespace-ul.
  • Durata de viață.
  • Gradul maxim acceptabil de perimare.
  • Declanșatorul invalidării.
  • Comportamentul la cache miss.
  • Comportamentul când Redis nu este disponibil.
  • Protecția împotriva thundering herd.
  • Datele care nu trebuie memorate niciodată în cache.
EroareComportament sigur pentru cache
Cheia lipseșteRecalculați sau citiți din sursa de adevăr
Redis nu este disponibilDegradați către sursă, cu protecție de rată
Intrare perimatăExpirați sau invalidați
Schimbare de serializareVersiunați namespace-ul cheilor
Presiune asupra memorieiEliminați mai întâi datele care pot fi reconstruite
Cheie foarte solicitatăAdăugați cache local, sharding sau request coalescing

Nu faceți întreaga aplicație indisponibilă doar pentru că un cache opțional este căzut. Folosiți timeout-uri limitate și căi de fallback. Pe de altă parte, nu ascundeți toate erorile; o întrerupere prelungită a cache-ului poate supraîncărca baza de date sursă.

Ce se schimbă atunci când Redis este folosit ca job queue?

O coadă reprezintă lucrări în așteptare, astfel încât aplicația trebuie să definească semantica livrării și a recuperării. Redis este un server de structuri de date; garanțiile depind de biblioteca de cozi și de protocolul worker-ului.

Decideți:

  1. Când este considerat un job acceptat?
  2. Când este confirmat?
  3. Ce se întâmplă dacă un worker se oprește după efectuarea side effect-ului, dar înainte de confirmare?
  4. Cum sunt întârziate și limitate retry-urile?
  5. Unde ajung joburile eșuate definitiv?
  6. Cum este făcută sigură execuția duplicată?
  7. Cum este observată adâncimea cozii?
  8. Poate fi reconstruit payload-ul jobului?

Construiți workeri idempotent. O captură de plată, un e-mail sau un import de date poate fi livrat de mai multe ori după o eroare. Folosiți o cheie de idempotency la nivel de business și înregistrați finalizarea în baza de date sursă de adevăr.

Separați numele cozilor în funcție de workload și prioritate. Un job media lent nu ar trebui să blocheze procesarea resetării parolelor sau a webhook-urilor. Evitați introducerea secretelor în payload-urile joburilor atunci când este suficient un ID de referință.

O implementare de cache și coadă Redis ar trebui să documenteze care chei sunt eliminabile și care reprezintă lucrări de business.

Cum conectează rețelistica privată serviciile la Redis?

Activați rețelistica proiectului:

dockup network enable production --json

Serviciul Redis devine accesibil prin hostname-ul stabil <slug>.internal din serviciile aflate în același proiect. Faceți redeploy aplicației pentru ca Dockup să poată injecta variabilele interne de conectare.

Pentru a permite accesul doar privat la Redis:

dockup db private production/app-redis --json

Restaurați listener-ul public atunci când este necesar:

dockup db private production/app-redis --off --json

Rețelistica privată elimină calea prin internetul public pentru traficul din același proiect, dar nu înlocuiește autentificarea. Păstrați secretele de conectare Redis și limitați serviciile care le primesc.

Proiecte diferite nu pot accesa rețeaua privată a celuilalt. Această limită poate fi utilă atunci când producția și staging-ul nu trebuie să partajeze chei de cache sau lucrări din cozi.

Consultați rețelistica privată și domeniile interne pentru modelul complet.

Cum ar trebui să afecteze erorile Redis aplicația?

Clasificați workload-ul înainte de a scrie codul de recovery.

WorkloadToleranță la pierderiRăspuns la indisponibilitate
Cache pentru fragmente HTMLRidicatăReconstruiți din sursă
Session storeScăzută spre medieEste posibil să deconectați utilizatorii; proiectați un fallback
Contoare pentru rate limitDepinde de politicăDefiniți explicit fail open sau fail closed
Job queueScăzutăOpriți acceptarea sau persistați în altă parte
Distributed lockFoarte scăzută pentru secțiuni criticeFolosiți fencing/idempotency
Feature cacheRidicatăFolosiți valoarea implicită sau sursa

Un client de cache nu ar trebui să facă retry la nesfârșit. Retry-urile lungi pot consuma fiecare worker al aplicației și pot transforma un incident Redis într-o întrerupere completă. Workerii cozilor ar trebui să aplice backoff, să expună lucrările eșuate și să se oprească după o politică definită.

Inspectați dimensiunea Redis și logurile runtime ale aplicației consumatoare:

dockup db size production/app-redis --json
dockup logs production/api --json

Creșterea dimensiunii poate indica lipsa expirării, o adâncime necontrolată a cozii, payload-uri prea mari sau namespace-uri abandonate. Nu tratați restartul bazei de date ca prim răspuns la timeout-urile aplicației; verificați mai întâi configurația, rețeaua și comportamentul clientului.

Cum se integrează backup-ul, migrarea și monitorizarea în Redis?

Dockup expune fluxul de lucru pentru backup-ul bazei de date gestionate:

dockup db backups production/app-redis --json
dockup db backup production/app-redis --json

Dacă un backup Redis îndeplinește obiectivul de recovery al workload-ului depinde de semnificația datelor. Un backup de cache poate fi inutil. Un backup al unei cozi poate pierde în continuare lucrările acceptate după momentul backup-ului. Joburile critice pentru business ar trebui să aibă, atunci când este posibil, o înregistrare recuperabilă în afara cozii.

Mutați Redis între noduri cu:

dockup db migrate production/app-redis \
  --node <nodeId> \
  --json

Planificați impactul migrării asupra clienților și workerilor. Confirmați că reconectarea, retry-urile și comportamentul de idempotency funcționează înainte de a face migrarea în producție.

Monitorizați metricile la nivelul aplicației pe lângă dimensiunea bazei de date:

  • Rata de cache hit.
  • Latența cache miss.
  • Evictions.
  • Adâncimea cozii și vechimea celui mai vechi job.
  • Numărul de joburi reușite, retrimise și eșuate.
  • Concurența workerilor.
  • Erorile de conectare la Redis.
  • Dimensiunea payload-urilor.

Dockup măsoară consumul de CPU, RAM și disk în fiecare minut în raport cu balanța planului. Planul Pro recomandat costă 20 USD pe lună și include un credit de utilizare de 20 USD, dar metricile workload-ului — nu numele planului — ar trebui să determine deciziile privind capacitatea.

Care este un checklist sigur pentru Redis în producție?

Înainte de lansare, verificați:

  1. Ținta exactă project/db.
  2. Responsabilitățile pentru cache și coadă sunt documentate.
  3. URL-ul de conectare este un secret mascat.
  4. Politica de rețelistică privată este decisă.
  5. Fiecare cache are TTL sau invalidare explicită.
  6. Workerii cozilor sunt idempotent.
  7. Comportamentul pentru retry și dead letter este definit de sistemul de cozi.
  8. Există alerte pentru dimensiune și adâncimea cozii.
  9. Valoarea și limitările backup-ului sunt înțelese.
  10. Restartul și migrarea necesită aprobare.

Exemplu de separare a cache-ului și cozii

O aplicație mică poate începe cu o singură bază de date Redis atunci când riscul este scăzut, dar folosiți prefixe clare pentru chei:

cache:user-profile:v2:<user-id>
cache:catalog:v5:<product-id>
queue:email:waiting
queue:email:active
lock:invoice:<invoice-id>

Pe măsură ce workload-ul crește, separați starea critică a cozii de starea cache-ului supusă unei eliminări agresive. Aceasta este o limită operațională, nu doar o preferință de denumire.

Un design de succes pentru cache și coadă Redis face comportamentul aplicației previzibil atunci când Redis este rapid, lent, gol sau indisponibil.

Pentru operațiuni relaționale cu sursă de adevăr, consultați PostgreSQL gestionat. Pentru opțiuni mai largi privind capacitatea, consultați strategii de scalare a bazelor de date. Folosiți referința CLI Dockup pentru comenzile curente ale bazelor de date.

Definiți evoluția cheilor și a payload-urilor

Datele din cache și cozi supraviețuiesc unui singur proces al aplicației. O versiune nouă poate citi chei scrise de versiunea anterioară în timpul unei tranziții blue-green. Versiunați namespace-urile cheilor și payload-urile joburilor astfel încât ambele versiuni să poată coexista.

Pentru cozi, includeți o versiune a payload-ului și păstrați workerii capabili să proceseze cel puțin versiunile care ar putea fi încă în așteptare. Un rollback al deployment-ului poate restaura codul vechi în timp ce joburile în format nou rămân în Redis. Fără compatibilitate, rollback-ul aplicației poate crește numărul de erori.

Testați intenționat presiunea asupra resurselor

Într-un mediu non-production, testați chei lipsă, răspunsuri Redis lente, resetări de conexiune, backlog-ul cozii, livrarea duplicată și o condiție de memorie plină sau aproape plină. Observați dacă aplicația face fail open, fail closed, retry sau supraîncarcă o altă dependență.

Un runbook pentru cache și coadă Redis ar trebui să stabilească limite pentru numărul de retry-uri și concurență. Buclerele de retry nelimitate pot consuma toți workerii și pot face recovery-ul mai dificil decât incidentul inițial.

Păstrați o cale de recovery către sursa de adevăr

Pentru joburile critice, stocați suficiente date în baza de date principală pentru a reconstrui lucrările după pierderea Redis. O coadă ar trebui să accelereze procesarea, nu să devină singura înregistrare a faptului că a avut loc o acțiune a clientului.

Începeți cu un deployment verificabil

Configurați Redis într-un proiect non-production, testați fallback-ul cache-ului și livrarea duplicată a joburilor și faceți politica privind erorile explicită înainte de a direcționa lucrări critice către sistem.

Începeți gratuit la app.dockup.ai. Planul Free costă 0 USD pe lună, include un credit inițial de 10 USD și oferă suport pentru un workspace, trei baze de date și trei deployment-uri.

Întrebări frecvente

Poate Dockup să creeze Redis gestionat?

Da. Folosiți comanda de creare a bazei de date gestionate cu tipul redis, apoi conectați aplicația folosind datele de conectare returnate și stocate ca secret.

Ar trebui ca datele de cache și cele ale cozii să partajeze aceeași instanță Redis?

Pot face acest lucru pentru un workload mic, cu risc redus, dar separarea este mai sigură atunci când eviction-ul cache-ului și retenția critică a cozii au cerințe diferite de disponibilitate și memorie.

Garantează Redis că un job din coadă rulează exact o dată?

Nu ar trebui presupusă nicio garanție generală de tip exact-once. Semantica livrării depinde de biblioteca de cozi și de designul worker-ului, așadar faceți side effect-urile idempotent.

Poate Redis folosi rețelistica privată Dockup?

Da. Activați rețeaua proiectului, faceți redeploy serviciilor consumatoare pentru variabilele interne și, opțional, faceți baza de date Redis accesibilă doar privat.

Este suficient un backup Redis pentru o coadă critică de joburi?

Nu neapărat. Acesta reprezintă un moment din timp și este posibil să nu includă lucrările acceptate ulterior. Păstrați înregistrări sursă recuperabile și definiți recovery-ul joburilor la nivelul aplicației.