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?
quelle
Antworten:
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
quelle
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.
quelle