A pesquisa entre dados cruza vários microsserviços


12

Eu tenho dados para um determinado domínio distribuído entre um microsserviço e um banco de dados herdado. Eu tenho uma pesquisa que abrange campos no banco de dados herdado e no microsserviço. Anteriormente (antes da divisão do microsserviço), isso era feito com 1 consulta sql. Agora, preciso de uma chamada REST e uma consulta ao banco de dados legado para atender a essa funcionalidade de pesquisa. Estamos falando de alguns milhões de linhas aqui. Como posso modelar isso melhor? Devido ao volume de dados, a chamada REST também retorna resultados paginados. A abordagem ingênua para acionar uma chamada SQL e combinar e mesclar resultados com a resposta REST é muito lenta e não é realmente prática.

Respostas:


20

Um recurso de pesquisa pode ser modelado como um serviço separado, com responsabilidade separada dos dois serviços mencionados. Portanto, a abordagem aqui pode ser criar um novo serviço ('pesquisa') e armazenar uma cópia dos dados de ambos os serviços em um formato fácil de indexar e pesquisar, possivelmente também desnormalizado para gerar resultados rapidamente. o formato desejado.

Assim, por exemplo, você poderia ter o banco de dados SQL herdado usando, por exemplo, mySql, o outro microsserviço usando, por exemplo, MongoDB, e o novo serviço de pesquisa usando a pesquisa elástica com dados de ambos já colados (desnormalizados) para um acesso mais conveniente. é claro que os detalhes dependerão do tipo de pesquisa que você precisa realizar.

Os dados dos dois serviços seriam melhor transferidos de forma assíncrona para o índice de pesquisa por meio de um barramento de eventos como Kafka ou Hermes, a fim de aumentar a taxa de transferência e reduzir o acoplamento entre os serviços. Uma alteração em qualquer um dos dois serviços enviaria um evento informando o serviço de pesquisa para também atualizar seus dados.

Obviamente, existe o custo de um atraso adicional entre alterações nos serviços e no serviço de pesquisa, mas como os microsserviços são geralmente usados ​​em sistemas distribuídos, alguns atrasos e inconsistências temporárias são inevitáveis. Ter um serviço adicional e usar armazenamento extra para uma cópia dos dados que já estão nos outros dois serviços também é um custo típico de ter um sistema altamente distribuído e escalável usando microsserviços.


Eu já pensei em criar um serviço separado. A única coisa que me dá algum desconforto - a criação de mais um banco de dados apenas para pesquisa (alimentando-a elástica seria outra opção, mas temos alguns gargalos de infra-estrutura)
senseiwu

7
Infelizmente, os microsserviços têm custos como este. Ser capaz de escalar horizontalmente significa que o acoplamento precisa ser fraco e isso significa que geralmente haverá duplicação de dados. Você também recebe muito mais tráfego de rede. A escalabilidade geralmente significa uma queda no desempenho por unidade de hardware e a escolha de uma arquitetura em detrimento de outra (por exemplo, microsserviços versus monólito) deve levar em consideração essa compensação.
Michał Kosmulski 5/07
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.