Un servei descendent (en anglès, downstream service) és un servei extern del qual depèn funcionalment una aplicació per obtenir dades o completar una operació. En una arquitectura de microserveis, un servei pot tenir diversos serveis descendents als quals fa crides per respondre una única petició del client.
Context En arquitectures distribuïdes, els serveis s'organitzen en cadenes de dependències. Quan el servei A crida el servei B per completar una operació, B és un servei descendent d'A. Alhora, A és un servei ascendent (upstream) respecte de B. Un mateix servei pot ser descendent d'uns i ascendent d'altres dins d'una mateixa arquitectura.
Aquesta relació introdueix un risc important: si un servei descendent falla o respon lentament, l'efecte es propaga cap amunt i pot degradar o bloquejar tot el sistema. Per exemple, si un servei de pagaments triga massa a respondre, el servei de comandes que en depèn pot esgotar el seu temps d'espera i retornar un error al client.
Gestió de fallades Per protegir-se de la inestabilitat dels serveis descendents, s'apliquen diversos patrons de resiliència:
Temps d'espera (timeout): limitar el temps màxim que s'espera una resposta d'un servei descendent per evitar bloquejos indefinits. Reintents (retries): tornar a intentar una crida fallida, útil per a fallades transitòries de xarxa. Patró de tallacircuit (circuit breaker): aturar temporalment les crides a un servei descendent que falla repetidament, evitant la saturació del sistema. Degradació controlada (graceful degradation): retornar una resposta parcial o una dada per defecte quan un servei descendent no és disponible.
Ús en programació asíncrona En aplicacions asíncrones construïdes amb asyncio, les crides a serveis descendents s'executen habitualment de manera concurrent mitjançant asyncio.gather(), de manera que diverses crides a serveis independents es llancen alhora i el temps total d'espera és el del servei més lent, no la suma de tots. Aquesta tècnica és especialment rellevant en el patró backend-for-frontend, on un servei intermedi agrega resultats de múltiples serveis descendents en una sola resposta per al client.
Vegeu també Microserveis Patró de tallacircuit Patró de dispersió i recollida
Referències
Fowler, M. (2022). Python Concurrency with asyncio. Manning Publications. Capítol 10.