O SQL Server e o Mongo podem ser usados ​​juntos?


14

Temos um site voltado para notícias e com alto tráfego na web. A arquitetura é o DB - Repo Layer - Services Layer - Asp.Net MVC, frequentemente visto. O problema que estamos vendo é em torno do desempenho de leitura. Acontece que todo esse material de objeto de domínio DDD é ótimo, em teoria, para as regras de negócios, mas tornou a vida mais difícil quando se trata de otimizar o desempenho da leitura.

Como solução, estou considerando algo totalmente novo (para nós): usar noSQL. Eu gostaria de usar um banco de dados noSQL para os dados apresentados em nosso site. Não podemos nos livrar do nosso SQL Server (pelo menos não tão cedo), mas parece-me que uma etapa prática seria usar o Mongo como um banco de dados de consulta para todo o novo desenvolvimento.

Minha pergunta é se é possível usar o SQL Server como seu banco de dados de registro e o Mongo como seu banco de dados de consultas juntos ?

Portanto, quando um de nossos editores atualizar um registro, os dados serão armazenados no SQL Server. Isso é necessário, porque há muito código legado que não pode ser reescrito da noite para o dia.

Mas quando um visualizador no site visualiza um artigo ou uma lista de artigos, eu gostaria de aproveitar o desempenho do Mongo versus o SQL Server. Para manter os dados atualizados, digamos 15 minutos ou menos, os dados do SQL Server precisariam atualizar o Mongo. O RDBMS possui ferramentas de replicação para operações como essa e estou me perguntando se existe algo para fazer o mesmo do SQL Server para o Mongo. Servidor Lync, talvez?


3
Possível? Claro que é possível, como dois armazenamentos de dados separados. O que exatamente você está perguntando aqui?
Oded

Mas você pode usá-los juntos? Com o Mongo DB atuando basicamente como um cache somente leitura para os dados?
John

1
Novamente, é claro que você pode "usá-los juntos". Mas não está claro o que isso significa. Desde que você tenha algum tipo de mecanismo de atualização para o mongo, você estará pronto. Veja as postagens de Udi Dahan - mas cabe a você definir o mecanismo.
Oded

1
Nunca mudamos para o MongoDB, no entanto, parece que no próximo ano poderemos. Uma maneira de transição que fizemos foi armazenar JSON em campos varchar. De tudo o que li, não há uma boa maneira de mover dados entre o NoSQL e o SQL - tudo precisará ser personalizado, especialmente porque os bancos de dados NoSQL existentes variam muito na maneira como eles fazem as coisas. .
John John

1
@ John, se você deseja se relacionar com o relacional e deseja se afastar do SQL Server, consulte o Postgresql e sua integração com o json . Assim, armazenando dados em uma coluna json que pode ser manipulada no banco de dados.

Respostas:


13

Você encontrou um problema que muitos têm antes de você ... um banco de dados otimizado para leitura raramente é bom para eficiência de gravação e vice-versa. Uma abordagem que evoluiu desse impedimento de leitura e gravação é o CQRS (Segregação de responsabilidade de consulta de comando). Apesar da Wikipedia vincular os dois, o CQRS e o CQS são tecnicamente diferentes. O CQS exige apenas que um método faça uma alteração (comando) ou peça informações (consulta) nunca as duas.

O CQRS vai um passo além e especifica que você possui um modelo separado para consultas e comandos. Esta etapa única permite separar seu banco de dados de leitura e gravação. Qual é o que você quer fazer.

Não posso dizer que sou especialista em Mongo ou configurá-lo para funcionar com o SQL Server. Mas, pelo que entendi, as pessoas usam o Mongo como uma visão desnormalizada de seu banco de dados transacional. A atualização do Mongo a partir do banco de dados transacional pode se resumir à execução de um SQL Agent. Ou ter um serviço separado para pesquisar o banco de dados.

Uma alternativa ainda melhor seria fazer com que seu serviço de comando dispense um evento sempre que uma atualização for feita. Você teria um serviço que ouviu esse evento e atualizou o MongoDB com essas informações. Essa é a abordagem fundamental ao Event Sourcing (pesquise Event Sourcing na página).

Greg Young, um dos líderes de pensamento no mundo DDD atualmente está escrevendo um livro na Série Fowler Signature Series no CQRS chamado Event-Centric (costumava ser chamado CQRS). Fowler escreveu um post em seu bliki descrevendo a abordagem


+1 CQRS se encaixa bem aqui. Use eventos para preencher e atualizar um banco de dados de documentos usado para criar suas visualizações e deixar seu banco de dados sql como está.
você precisa

Não adotamos um sistema CQRS, no entanto, prestei atenção ao que Greg, Udi e outros escreveram. Uma grande parte do CQRS não é uma plataforma específica, mas apenas pensa em comandos e consultas separadamente. Acho que Greg nunca acabou escrevendo um livro, embora o Microsoft Patterns and Practices tenha lançado um.
John

1
A única coisa que eu acrescentaria a esta resposta é: Se o seu caso de uso é especificamente relacionado a isso com MS SQL e MVC, você já considerou o BrightstarDB em vez do MongoDB para a parte NoSQL? Possui compatibilidade com Entity Framework e LINQ, o que pode facilitar a transição para você.
CrazyPyro

1

Sim. No meu projeto atual, estamos obtendo dados e armazenando-os no SQL Server e, em seguida, criando índices de pesquisa usando Lucene / Solr e armazenando-os no MongoDB. Porém, a preenchimento do MongoDB é feita com um carregador personalizado - sem replicação do SQL Server ou atualização automática.


Ok, só estou curioso, por que não preencher diretamente o mongo? Você tem a mesma restrição de ter que usar os dois?
perfil completo de Yati Sagade

Nosso SQL Server existente não pode ser reescrito da noite para o dia. Meu pensamento é que este é um pequeno passo, mas útil.
John

@yatisagade: Certo. Temos relatórios que precisam ser executados no SQL Server, mas temos um aplicativo de pesquisa global que usa os índices Lucene.
TMN
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.