Frage

Meine Web App verwendet ADO.NET gegen SQL Server 2008-Datenbank schreibt passieren gegen eine primäre (Verlag) Datenbank, aber liest werden über die primäre Last ausgeglichen und eine sekundäre (Subscriber) Datenbank. Wir verwenden SQL Server-interne Transaktionsreplikation die sekundären up-to-date zu halten. Die meiste Zeit, die paar Sekunden Latenz ist kein Problem.

Allerdings habe ich einen Fall, wo Ich mag würde zu blockieren, bis die Transaktion an dem sekundären Standort verpflichtet. Sperrung für ein paar Sekunden ist in Ordnung, aber eine veraltete Seite an den Benutzer zurückkehrt nicht. Gibt es eine Möglichkeit in ADO.NET oder TSQL angeben, dass ich für die Replikation abgeschlossen ist, warten soll? Oder kann ich, aus dem Verlag, überprüfen Sie den Replikationsstatus der Transaktion ohne manuell auf den sekundären Server zu verbinden.

[Bearbeiten] 99,9% der Zeit, die Daten in dem Teilnehmer ist „frisch genug“. Aber es ist eine Operation, die nicht länger gültig ist. Ich kann nicht aus dem Verlag jedes Mal für den unwahrscheinlichen Fall gelesen, dass es ungültig geworden ist. Wenn ich dieses Problem nicht unter der Transaktionsreplikation lösen kann, können vorschlagen, dass Sie eine alternative Architektur?

War es hilfreich?

Lösung

Es gibt keine solche Lösung für SQL Server, aber hier ist, wie ich um es in anderen Umgebungen gearbeitet haben.

Mit drei separaten Verbindungszeichenfolgen in Ihrer Anwendung, und wählen Sie die rechten basierend auf den Bedürfnissen der Anfrage:

  • Realtime - Punkte direkt an dem einem Master-Server. Alle Schreib gehen auf diese Verbindungszeichenfolge, und nur die missionskritischen liest hier.
  • Near-Realtime - Punkte bei einer Last ausgeglichen Pool von Abonnenten. Keine schreibt hier gehen, nur liest. Wird für die überwiegende Mehrheit der OLTP liest.
  • Verzögerte Berichterstattung - In Ihrer Umgebung gerade jetzt, es wird auf den gleichen Lastenausgleich Pool von Abonnent, aber auf der Straße können Sie eine Technologie wie Protokoll versenden, einen Pool von Servern hinter 8-24 Stunden haben. Diese Skala heraus wirklich gut, aber die Daten der weit hinter sich. Es ist toll für die Berichterstattung, suchen, langfristige Geschichte, und andere Nicht-Echtzeit-Anforderungen.

Wenn Sie entwerfen Sie Ihre App diese drei Verbindungszeichenfolgen von Anfang an zu verwenden, Skalierung viel einfacher ist, vor allem im Fall Sie erleben.

Andere Tipps

Sie beschreiben eine synchrone Spiegelung Situation. Die Replikation kann nicht per definitionem unterstützen Ihre Anforderung. Replikation muss Wartezeit für eine Transaktion, bevor zu begehen sie aus dem Protokoll zu lesen und es an den Händler zu liefern und von dort an die Teilnehmer, die die Replikation per Definition bedeutet ein Fenster der Gelegenheit hat für Daten sein aus sync.

Wenn Sie eine Anforderung eine Operation haben die authorithative Kopie der Daten zu lesen, dann sollten Sie diese decission im Client zu machen und sicherzustellen, dass Sie aus dem Verlag in diesem Fall lesen.

Sie können zwar, in threory, Validieren, ob eine bestimmte Transaktion an die Teilnehmer verteilt wurde oder nicht, sollten Sie nicht stützen Ihr Design auf. Transaktionsreplikation macht keine Latenzgarantie durch Design, so dass Sie nicht auf einem ‚perfekten Tag‘ Betriebsmodus verlassen können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top