Search
Sincronización del catálogo de productos (activities y boxes) hacia el índice de Elasticsearch que alimenta la búsqueda del sitio.
Overview
El dominio Search mantiene sincronizado el índice products de Elasticsearch con los
productos del monolito. Publica tres eventos —created, updated y deleted— disparados
todos por la misma señal post_save de Django.
Los eventos created y updated llevan el documento completo del producto, no solo su
id: el consumidor hace un upsert directo sin volver a consultar al monolito.
created y updated son operacionalmente equivalentes para el consumidor (ambos hacen
upsert). La distinción es informativa.
Doble transporte
El mismo documento de producto viaja por dos caminos distintos:
- Por eventos — este dominio, vía Pub/Sub.
- Por HTTP —
SearchIndexer.index()→SearchServiceClient.sync_products_batch, usado para el sync completo y para la reconciliación de documentos obsoletos.
Solo el camino HTTP tiene reconciliación, así que un producto borrado de la base sin pasar
por save() queda huérfano en el índice hasta el próximo full sync.