El patró de dispersió i recollida (en anglès, scatter-gather) és un patró d'integració i disseny de programari utilitzat en sistemes distribuïts i arquitectures de microserveis. Consisteix a enviar una mateixa petició o tasca a múltiples destinataris de manera concurrent (fase de dispersió) i, posteriorment, recollir i agregar totes les respostes en un únic resultat (fase de recollida).

Fases El patró es divideix en dues fases clarament diferenciades:

Dispersió (scatter): La petició original es descompon i s'envia de manera concurrent a diversos proveïdors o serveis independents. Els destinataris processen les seves parts de manera paral·lela, sense esperar els uns als altres.

Recollida (gather): Una vegada que tots els destinataris han respost, els resultats es recullen i s'agreguen per formar una resposta unificada que es retorna al sol·licitant original.

Ús en programació asíncrona En aplicacions asíncrones amb Python, aquest patró s'implementa habitualment amb la funció asyncio.gather(), que executa múltiples corutines de manera concurrent i espera que totes finalitzin abans de retornar els resultats. asyncio.gather() manté l'ordre determinista dels resultats: independentment de l'ordre en què les corutines acabin, els resultats es retornen en el mateix ordre en què s'han passat com a arguments.

Un exemple típic d'aplicació és un servei backend-for-frontend que, per respondre una sola petició d'un client, necessita consultar concurrent un servei de productes, un d'inventari i un de recomanacions. Amb el patró de ispersió i recollida, les tres crides es llancen alhora i el temps total d'espera és aproximadament el de la crida més lenta, en lloc de la suma de totes tres.

Vegeu també Programació asíncrona Microserveis

Referències

Fowler, M. (2022). Python Concurrency with asyncio. Manning Publications. Capítol 4.