La búsqueda a través de datos cruza varios microservicios

13

Tengo datos para un cierto dominio distribuido entre un microservicio y una base de datos heredada. Tengo una búsqueda que abarca campos en bases de datos heredadas y de microservicios. Anteriormente (antes de la división del microservicio), se realizaba con una consulta de 1 sql. Ahora necesito una llamada REST y una consulta a la base de datos heredada para servir esta funcionalidad de búsqueda. Estamos hablando de unos pocos millones de filas aquí. ¿Cómo puedo modelar esto mejor? Debido al volumen de datos, la llamada REST también devuelve resultados paginados. El enfoque ingenuo para disparar una llamada SQL y combinar y combinar resultados con la respuesta REST es demasiado lento y no es realmente práctico.

senseiwu
fuente

Respuestas:

21

Una función de búsqueda se puede modelar como un servicio separado con responsabilidad separada de los dos servicios que menciona. Entonces, el enfoque aquí podría ser crear un nuevo servicio ('búsqueda') y hacer que almacene una copia de los datos de ambos servicios en una forma que sea fácil de indexar y buscar, posiblemente también desnormalizada para dar resultados rápidamente en El formato deseado.

Entonces, por ejemplo, podría tener la base de datos SQL heredada usando, por ejemplo, mySql, el otro microservicio usando, por ejemplo, MongoDB, y el nuevo servicio de búsqueda usando Elasticsearch con datos de ambos ya pegados (desnormalizados) para un acceso más conveniente. por supuesto, los detalles dependerán del tipo de búsquedas que necesite realizar.

Los datos de los dos servicios se transferirán mejor de forma asíncrona al índice de búsqueda a través de un bus de eventos como Kafka o Hermes para aumentar el rendimiento y reducir el acoplamiento entre los servicios. Un cambio en cualquiera de los dos servicios enviaría un evento informando al servicio de búsqueda que también actualice sus datos.

Por supuesto, existe el costo de un retraso adicional entre los cambios en los servicios y en el servicio de búsqueda, pero dado que los microservicios se usan generalmente en sistemas que se distribuyen, algunos retrasos e inconsistencias temporales son inevitables de todos modos. Tener un servicio adicional y usar almacenamiento adicional para una copia de datos que ya está en los otros dos servicios también es un costo típico de tener un sistema altamente distribuido y escalable que utiliza microservicios.

Michał Kosmulski
fuente
Ya pensé en crear un servicio separado. Lo único que me da algo de molestia - la creación de una nueva base de datos sólo para la búsqueda (alimentando al elástica sería otra opción, pero tiene algunos problemas de infraestructura)
senseiwu
77
@zencv Desafortunadamente, los microservicios tienen costos como este. Ser capaz de escalar horizontalmente significa que el acoplamiento debe ser débil y esto significa que a menudo habrá duplicación de datos. También obtienes mucho más tráfico de red. La escalabilidad a menudo significa una caída en el rendimiento por unidad de hardware y la elección de una arquitectura sobre otra (por ejemplo, microservicios frente a monolitos) debe tener en cuenta esta compensación.
Michał Kosmulski