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?
fonte
Respostas:
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
fonte
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.
fonte