reteaua Google - sa nu depinda de alte cabluri; 6 x 9 availability pt Google Login
Sistem neperformant:
Throttling: ex. rate limiting
Queuing
Auto-scaling
Startup time: rau pe Java > mai rau Spring > si mai rau EJB
Conexiune persistenta Browser-BE: websocket/grpc/http2; pt multe request-uri/zi de la putini useri
Disintegrator - spargere cod mare in bucati mici
avantaje: decuplare, refolosire, izolare bug, versiune java la zi (CVE, Spring), testabil mai usor (pe bucati), scaleaza independent, deploy independent (faster cycle time)
Spring AI, Spring MCP
Integrator: motive sa nu spargi codul
latenta, cuplare stransa, microserviciile sunt scumpe; consistenta datelor (ACID in loc de eventual consistency)
https://www.infoq.com/news/2023/03/stop-cloud-zombies-qcon/
enum in Dtos pt REST compatibility: cand modifici/scoti din enum strici; daca faci rename pe un camp din Dto; camp din required in optional;
test care verifica ca nu ai facut breaking change pe contract;
subjson in json "metadata" pt alte adaugiri
Clientii v1 identificati prin header-ele Authorization, X-Api-Key, X-Client-Id, Traceparent (incl timp)
OpenTelemetry Java Agent- pus in JVM pt tracing (userv)
swagger-ts-generator
isaqb.org - certificare arhitect
Get id repetat - eroare 429 Too Many Requests -> use batch API
Request multiplexing - astepti sa vina mai multe req, le pui in asteptare (sincron) ~ batching
Netflix: grpc + graphQL
CQRS - segregare responsabilitati command / query
POST/PUT return data?
Caz RM creare programare in 2 pasi -> ret. patientId -> GET alte patientId -> afli date despre alti pacienti
202 Accepted (dupa validare request)
200 OK [Retry-after] - prea lung, nu e gata, dar totul e ok, ruleaza async; clientul face polling
200 OK {status: DONE}
302 Redirect - pt rezultate mari
SAU: serverul creeaza un topic la care clientul se aboneaza
SAU: clientul primeste un HTTP callback (webhook) pe care sa faca polling
SAU: websocket
Agregator - face batching
Proxy - ruteaza orbeste
API proxy - la intrare in system
Service proxy - la iesire, spre API externe
Gateway: caching, compresie date, rutare requests, load balancing, service registry, http access log, metrici, tracing,
agrega date din mai multe API-uri == NOK ca implica business logic in Gw
autentifica request-uri (cu ajutorul unui serviciu), fara autorizare
rate limiting
Connect timeout < Response timeout -- trebuie setate, altfel infinite
Lock.tryLock(timeout)
Eroare 500 + header Retry-After - daca e din cauza unui serviciu extern (nu 500 propriu-zis)
resilience4j
health probe: aliveness & readiness (capabil de trafic)
unalive: conexiuni agatate permanent, disc corupt, OOME, deadlock
LB poate evita o instanta daca e slow/are erori.
Inbox table = store then process
Outbox table pattern = store and fwd
- pune mesajul in SQL cu un status, apoi luat si trimis extern, actualizat status
Operatii idempotente = retryable: GET, DELETE, PUT (overwrite)
POST: idempotent daca la retry trimite acelasi idempotency key (poate fi timestamp la ms); sau serverul sa tina un hash(comanda), salvat intr-un map cu comenzile din ultimele 30 minute -> daca primeste aceeasi comanda va face reject
PUT cu IK (UUID)
server.tomcat.max-connections
server.tomcat.accept-count
server.tomcat.threads.max
Bulkhead = apeluri simultane per JVM
Rate limiter = apeluri intr-un interval de timp
Quartz - orchestrare timers prin DB
Compartimentalizare -> izolare serviciu picat
Cache - for latency or for data replication
App de baza are un SLA (99.99) -> e ok sa chemi alt API cu SLA mai mare (99.999)
Istio: construieste un mic scut in jurul unui serviciu (throttling etc - il face ca un gateway)
Strategii de deployment: canary (ex. FB release in Argentina), blue/green (gradually transfer traffic), deploy in staging pt testeri si clienti timp de _;
release notes, feature flags
shadow deploy=rutezi input din prod si verifici ca da la fel, in paralel cu versiunea veche
Ex. connection pool starvation:
@Transactional
method() {
synchronized(b) {
// call a slow api
}
}
Cache miss 99%: e prea mic, a expirat, nu este gasita cheia (lipseste hashCode, equals in clasa cheii)
Teste pe cache!! --> AgencyCacheTest
Cache hit prea mare: key collision? (chei trunchiate, sunt mereu gasite)
@TimeAspect
@Timed
MeterRegistry - raporteaza metrici
@Observed
Monolit (risc: cod complex) -> microservicii (risc: integrarile)
=>
Mockito -> WireMock (care nu reflecta realitatea din prod)
Monolit: multe unit teste; uS: multe teste de integrare
uS: mai multe bug-uri in yaml config decat in cod
@FeignClient - pt apel rest dintr-un uS la altul
Jeff Bezos manifesto for externalization (2002)
ZoomIt- timer (gong)
Surse:
video: https://www.youtube.com/watch?v=arUOVFUKt6s
drive: https://drive.google.com/open?id=1A2WIOb6tZvkzkHwDEAQSfFCKQAIG4imt&usp=drive_fs
https://victorrentea.ro/slides/
Niciun comentariu:
Trimiteți un comentariu