Situación actual
Estamos implementando (y ahora manteniendo) una aplicación web de compras en línea en una arquitectura de microservicio.
Uno de los requisitos es que la empresa debe poder aplicar reglas sobre lo que nuestros clientes agregan a su carrito, a fin de personalizar su experiencia y el pedido final. Obviamente, se tuvo que establecer un motor de reglas de negocio e implementamos un "microservicio" específico para esto (si aún pudiéramos llamarlo así).
A lo largo de un año, este motor de reglas se ha vuelto cada vez más complejo, requiriendo más y más datos (por ejemplo, contenido del carrito pero también información del usuario, su función, sus servicios existentes, cierta información de facturación, etc.) para poder calcular esas reglas
Por el momento, nuestro shopping-cart
microservicio está recopilando todos estos datos de otros microservicios. Aunque parte de esta información es utilizada por shopping-cart
, la mayoría de las veces se usa principalmente para alimentar el motor de reglas.
Nuevos requisitos
Ahora llega la necesidad de otras aplicaciones / microservicios para reutilizar el motor de reglas para requisitos similares. En la situación actual, tendrían que transmitir el mismo tipo de datos, llamar a los mismos microservicios y construir (casi) los mismos recursos para poder llamar al motor de reglas.
Continuando como está, enfrentaremos varios problemas:
- todos (llamando al motor de reglas) tienen que reimplementar la obtención de datos, incluso si no los necesitan para sí mismos;
- las solicitudes al motor de reglas son complejas;
- continuando en esta dirección, tendremos que transportar estos datos por toda la red para muchas solicitudes (piense en μs A llamando a μs B llamando al motor de reglas, pero A ya tiene algunos de los datos que necesita el motor de reglas);
shopping-cart
se ha vuelto enorme debido a la obtención de todos los datos;- Probablemente olvide muchos ...
¿Qué podemos hacer para evitar estos problemas?
Idealmente, evitaríamos agregar más complejidad al motor de reglas. También debemos asegurarnos de que no se convierta en un cuello de botella; por ejemplo, algunos datos son bastante lentos para recuperar (10 segundos o incluso más), por lo que implementamos la recuperación previa de shopping-cart
manera que es más probable que los datos estén allí antes de llamar a las reglas motor y mantener una experiencia de usuario aceptable.
Algunas ideas
- Deje que el motor de reglas obtenga los datos que necesita. Esto agregaría aún más complejidad, violando el principio de responsabilidad única ( aún más ... );
- Implemente un proxy μs antes del motor de reglas para obtener los datos;
- Implemente un "captador de datos" μs que el motor de reglas llama para obtener todos los datos que necesita a la vez (consulta compuesta).
shopping-cart
, pero podríamos adaptarla fácilmente a las necesidades de los otros microservicios (todavía están relacionados con los usuarios, los productos y los pedidos). Tal como lo vemos, que se necesitan los mismos datos de entrada, sobre todo porque el negocio es capaz de elegir los predicados de aplicar. Todos los datos son proporcionados por otros microservicios, excepto el contenido del carrito. Obtener los datos no es complejo per se, pero se vuelve complejo cuando tiene que llamar a ~ 10 otros microservicios y mantener la estructura esperada por el motor de reglas.