Situação atual
Estamos implementando (e agora mantendo) um aplicativo Web de compras on-line em uma arquitetura de microsserviço.
Um dos requisitos é que a empresa possa aplicar regras sobre o que nossos clientes adicionam ao carrinho, para personalizar sua experiência e o pedido final. Obviamente, um mecanismo de regras de negócios precisou ser implementado e implementamos um "microsserviço" específico para isso (se ainda pudéssemos chamá-lo).
Ao longo de um ano, esse mecanismo de regras tornou-se cada vez mais complexo, exigindo mais e mais dados (por exemplo, conteúdo do carrinho, mas também informações do usuário, sua função, seus serviços existentes, algumas informações de cobrança etc.) para poder calcular essas regras.
No momento, nosso shopping-cart
microsserviço está coletando todos esses dados de outros microsserviços. Embora parte desses dados seja usada por shopping-cart
, na maioria das vezes, é usada principalmente para alimentar o mecanismo de regras.
Novos requisitos
Agora chega a necessidade de outros aplicativos / microsserviços reutilizarem o mecanismo de regras para requisitos semelhantes. Na situação atual, eles teriam que transmitir o mesmo tipo de dados, chamar os mesmos microsserviços e criar (quase) os mesmos recursos para poder chamar o mecanismo de regras.
Continuando como está, enfrentaremos vários problemas:
- todos (chamando o mecanismo de regras) precisam reimplementar a busca dos dados, mesmo que não precisem deles;
- as solicitações para o mecanismo de regras são complexas;
- continuando nessa direção, teremos que transportar esses dados por toda a rede para muitas solicitações (pense em μs A chamando μs B chamando o mecanismo de regras, mas A já possui alguns dos dados que o mecanismo de regras precisa);
shopping-cart
tornou-se enorme devido a toda a busca de dados;- Eu provavelmente esqueço muitos ...
O que podemos fazer para evitar esses problemas?
Idealmente, evitaríamos adicionar mais complexidade ao mecanismo de regras. Também devemos garantir que ele não se torne um gargalo - por exemplo, alguns dados demoram a ser buscados (10s ou mais), por isso implementamos a pré-busca, de shopping-cart
modo que é mais provável que os dados existam antes de chamarmos as regras mecanismo e mantenha uma experiência aceitável do usuário.
Algumas ideias
- Deixe o mecanismo de regras buscar os dados necessários. Isso acrescentaria ainda mais complexidade, violando o princípio da responsabilidade única ( ainda mais ... );
- Implemente um proxy μs antes do mecanismo de regras para buscar os dados;
- Implemente um "buscador de dados" que o mecanismo de regras chama para buscar todos os dados necessários de uma só vez (consulta composta).
shopping-cart
, mas podemos adaptá-la facilmente às necessidades de outros microsserviços (eles ainda estão relacionados a usuários, produtos e pedidos). A nosso ver, eles vão precisar dos mesmos dados de entrada, especialmente porque a empresa é capaz de escolher os predicados para aplicar. Todos os dados são fornecidos por outros microsserviços, exceto o próprio conteúdo do carrinho. A busca dos dados não é complexa por si só, mas se torna complexa quando você precisa chamar ~ 10 outros microsserviços e manter a estrutura esperada pelo mecanismo de regras.