Können SQL Server und Mongo zusammen verwendet werden?

14

Wir haben eine große nachrichtenorientierte Website mit hohem Web-Traffic. Die Architektur ist Ihre häufig gesehene DB-Repo-Schicht - Service-Schicht - Asp.Net MVC. Das Problem, das wir gesehen haben, ist die Leseleistung. Es stellt sich heraus, dass all diese DDD-Domänenobjekt-Inhalte theoretisch hervorragend für Geschäftsregeln geeignet sind, aber das Leben in Bezug auf die Optimierung der Leseleistung erschwert haben.

Als Lösung betrachte ich (für uns) etwas völlig Neues: die Verwendung von noSQL. Ich möchte eine noSQL-Datenbank für Daten verwenden, die auf unserer Website präsentiert werden. Wir können unseren SQL Server nicht loswerden (zumindest nicht in Kürze), aber es scheint mir, dass ein praktischer Schritt darin besteht, Mongo als Abfragedatenbank für alle Neuentwicklungen zu verwenden.

Meine Frage ist, ob es möglich ist, SQL Server als Ihre Datenbank der Aufzeichnung und Mongo als Ihre Abfragedatenbank zusammen zu verwenden ?

Wenn einer unserer Redakteure einen Datensatz aktualisiert, werden die Daten in SQL Server gespeichert. Dies ist notwendig, da zu viel älterer Code nicht über Nacht neu geschrieben werden kann.

Wenn ein Betrachter auf der Website jedoch einen Artikel oder eine Liste von Artikeln anzeigt, möchte ich die Leistung von Mongo gegenüber SQL Server nutzen. Um die Daten auf dem neuesten Stand zu halten, sagen wir 15 Minuten oder weniger, müssten SQL Server-Daten Mongo aktualisieren. RDBMS verfügt über Replikationstools für Vorgänge wie diesen, und ich frage mich, ob es von SQL Server bis Mongo etwas gibt, mit dem Sie dasselbe tun können. Lync-Server vielleicht?

John
quelle
3
Möglich? Natürlich ist es auch möglich, zwei getrennte Datenspeicher zu verwenden. Was genau fragst du hier?
Oded
Aber kannst du sie zusammen benutzen? Mit der Mongo DB, die im Grunde genommen als Nur-Lese-Cache für die Daten fungiert?
John
1
Auch hier können Sie sie natürlich "zusammen verwenden". Aber es ist nicht klar, was das bedeutet. Solange Sie einen Update-Mechanismus für Mongo haben, können Sie loslegen. Siehe die Beiträge von Udi Dahan - aber es liegt an Ihnen, den Mechanismus zu definieren.
Oded
1
Wir sind nie zu MongoDB gewechselt, aber es sieht so aus, als ob wir nächstes Jahr könnten. Eine Übergangsweise, die wir gemacht haben, besteht darin, JSON in varchar-Feldern zu speichern. Nach allem, was ich gelesen habe, gibt es keine gute Möglichkeit, Daten zwischen NoSQL und SQL hin und her zu verschieben - es muss alles benutzerdefiniert sein, zumal die NoSQL-Datenbanken, die es gibt, hinsichtlich ihrer Funktionsweise sehr unterschiedlich sind .
John
1
@ John, wenn Sie auf der Suche nach relationalen Lösungen sind und bereit sind, sich von SQL Server zu entfernen, sollten Sie sich Postgresql und seine JSON-Integration ansehen . Auf diese Weise werden Daten in einer JSON-Spalte gespeichert, die dann in der Datenbank bearbeitet werden kann.

Antworten:

13

Sie haben ein Problem, das viele vor sich haben ... Eine zum Lesen optimierte Datenbank ist selten gut für die Schreibeffizienz und umgekehrt. Ein Ansatz, der sich aus diesem Lese-Schreib-Hindernis entwickelt hat, ist CQRS (Command Query Responsibility Segregation). Trotz der Verknüpfung der beiden Wikipedia sind CQRS und CQS technisch unterschiedlich. CQS verlangt lediglich, dass eine Methode entweder eine Änderung vornimmt (Befehl) oder Informationen abfragt (Abfrage), niemals beides.

CQRS geht noch einen Schritt weiter und gibt an, dass Sie ein separates Modell für Abfragen und Befehle haben. Dieser einzelne Schritt ermöglicht Dinge wie das Trennen Ihrer Lese- und Schreibdatenbank. Welches ist, was Sie tun möchten.

Ich kann nicht sagen, dass ich ein Experte für Mongo bin oder es so konfiguriere, dass es mit SQL Server funktioniert. Nach meinem Verständnis wird Mongo jedoch als denormalisierte Ansicht der Transaktionsdatenbank verwendet. Das Aktualisieren von Mongo von der Transaktionsdatenbank kann dazu führen, dass ein SQL-Agent ausgeführt wird. Oder über einen separaten Dienst, um die Datenbank abzufragen.

Eine noch bessere Alternative besteht darin, dass Ihr Command-Dienst bei jeder Aktualisierung ein Ereignis auslöst. Sie würden dann einen Dienst haben, der auf dieses Ereignis wartet und die MongoDB mit diesen Informationen aktualisiert. Dies ist der grundlegende Ansatz für Event Sourcing (Suche nach Event Sourcing auf der Seite).

Greg Young, einer der Vordenker in der DDD-Welt, schreibt derzeit ein Buch in der Fowler Signature Series über CQRS mit dem Titel Event-Centric (früher CQRS). Fowler hat in seinem Wiki einen Beitrag geschrieben , der den Ansatz beschreibt

Michael Brown
quelle
+1 CQRS passt hier gut. Verwenden Sie Ereignisse, um eine Dokumentdatenbank zu füllen und zu aktualisieren, die zum Erstellen Ihrer Ansichten verwendet wird, und belassen Sie Ihre SQL-Datenbank so, wie sie ist.
Quentin-Star
Wir haben kein CQRS-System eingeführt, aber ich habe darauf geachtet, was Greg, Udi und andere geschrieben haben. Ein großer Teil von CQRS ist keine bestimmte Plattform, sondern es geht nur darum, Befehle und Abfragen getrennt zu betrachten. Ich glaube nicht, dass Greg jemals ein Buch geschrieben hat, obwohl Microsoft Patterns and Practices eines veröffentlicht hat.
John
1
Die einzige Sache, die ich zu dieser Antwort hinzufügen möchte, ist: Wenn es in Ihrem Anwendungsfall speziell darum geht, dies mit MS SQL und MVC zu verwenden, haben Sie BrightstarDB anstelle von MongoDB für den NoSQL-Teil in Betracht gezogen ? Es ist mit Entity Framework und LINQ kompatibel, was Ihnen den Übergang erleichtern könnte.
CrazyPyro
1

Ja. In meinem aktuellen Projekt werden Daten abgerufen und in SQL Server gespeichert. Anschließend werden Suchindizes mit Lucene / Solr erstellt und in MongoDB gespeichert. Das Auffüllen von MongoDB erfolgt jedoch mit einem benutzerdefinierten Ladeprogramm - keine SQL Server-Replikation oder automatische Aktualisierung.

TMN
quelle
Okay, ich bin nur neugierig, warum nicht direkt Mongo bevölkern? Stehen Sie unter der gleichen Bedingung , dass Sie beide verwenden müssen?
Yati Sagade
Unser vorhandener SQL Server kann nicht über Nacht umgeschrieben werden. Mein Gedanke ist, dass dies ein kleiner, aber nützlicher kleiner Schritt ist.
John
@yatisagade: Richtig. Wir haben Berichte, die gegen SQL Server ausgeführt werden müssen, aber wir haben eine globale Such-App, die die Lucene-Indizes verwendet.
TMN