Echtzeitanwendungen mit hohem Datenverkehr werden häufig in Unternehmensumgebungen eingesetzt. Bei Echtzeitanwendungen werden Ihnen Informationen im Moment ihrer Erstellung zur Verfügung gestellt, und jede Verzögerung dabei kann zu erheblichen finanziellen Verlusten führen. Die größte Herausforderung bei diesen Echtzeitanwendungen mit hohem Datenverkehr besteht darin, über alle Änderungen im Datensatz benachrichtigt zu werden, damit die entsprechenden Ansichten aktualisiert werden können.
Diese Echtzeitanwendungen mit hohem Datenverkehr können sich jedoch nicht auf die herkömmliche Datenbank verlassen, da sie nur Abfragen der vorhandenen Daten unterstützen. Um den aktualisierten Datensatz zu erhalten, müssen Sie die Abfrage nach einem bestimmten Intervall, das nicht sofort erfolgt, erneut ausführen. Und diese periodische Abfrage führt auch zu Leistungs- und Skalierbarkeitsproblemen, da Sie meist auch dann teure Datenbankausflüge durchführen, wenn sich keine Änderungen am Datensatz ergeben.
SQL-Abhängigkeit wird von Microsoft in SQL Server bereitgestellt und wird auch von Oracle unter Windows unterstützt. Mit SqlDependency können Sie eine SQL-Anweisung angeben. SQL Server überwacht diesen Datensatz in der Datenbank auf Hinzufügungen, Aktualisierungen oder Löschungen und benachrichtigt Sie, wenn dies geschieht. Das Problem mit SqlDependency besteht jedoch darin, dass die Registrierung in der Datenbank aufgehoben wird, sobald es ausgelöst wird. Daher werden alle zukünftigen Änderungen in Ihrem Datensatz übersehen und Sie werden nicht benachrichtigt.
Darüber hinaus stellt SqlDependency keine Details zu dem Datensatz bereit, in dem die Änderung stattgefunden hat. Um also die Änderung im Datensatz zu finden, müssen Sie den gesamten Datensatz erneut abrufen, anstatt nur den spezifischen Datensatz direkt abzurufen, der hinzugefügt, aktualisiert oder aus dem Datensatz entfernt wird. Und das ist natürlich nicht effizient.
Zusätzlich zu den Einschränkungen von SqlDependency ist Ihre Datenbank auch nicht in der Lage, die Transaktionsanforderungen dieser Echtzeitanwendungen mit hohem Datenverkehr zu bewältigen, bei denen jede Sekunde Zehntausende Abfragen ausgeführt werden und die Datenbank schnell zu einem Skalierbarkeitsengpass wird. Denn obwohl Sie Ihre Anwendungsebene durch das Hinzufügen weiterer Anwendungsserver linear skalieren können, ist dies mit Ihrem Datenbankserver nicht möglich.
Dies ist, wo ein verteilter Cache Gefällt mir NCache kommt ins Spiel, weil es Ihnen ermöglicht, Daten zwischenzuspeichern und die teuren Datenbankfahrten zu reduzieren, die einen Skalierbarkeitsengpass verursachen.
NCache verfügt über eine leistungsstarke Funktion für kontinuierliche Abfragen, mit der Sie eine SQL-ähnliche Abfrage beim Cache-Cluster registrieren können. Diese kontinuierliche Abfrage bleibt im Cache-Cluster aktiv und wenn sich der Datensatz dieser Abfrage ändert, dann NCache benachrichtigt Ihre Echtzeitanwendung. Dieser kontinuierliche Abfrageansatz erspart Ihnen die regelmäßige Ausführung derselben teuren Abfrage für die Datenbank, um diese abzufragen.
Hier ist Beispielcode für NCache Kontinuierliche Abfrage:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
public void Main(string[] args) { … NCache.InitializeCache("myPartitionReplicaCache"); String query = "SELECT NCacheQuerySample.Business.Product WHERE this.ProductID > 100"; Hashtable values = new Hashtable(); values.Add("ProductID", 100); … onItemAdded = new ContinuousQueryItemAddedCallback(OnQueryItemAdded); onItemUpdated = new ContinuousQueryItemUpdatedCallback(OnQueryItemUpdated); onItemRemoved = new ContinuousQueryItemRemovedCallback(OnQueryItemRemoved); ContinuousQuery query = new ContinuousQuery(queryString, values); query.RegisterAddNotification(onItemAdded); query.RegisterUpdateNotification(onItemUpdated); query.RegisterRemoveNotification(onItemRemoved); _cache.RegisterCQ(query); … } //data set item is removed void OnQueryItemRemoved(string key){ … Console.WriteLine("Removed key: {0}", key); … } //data set item is updated void OnQueryItemUpdated(string key){ … Console.WriteLine("Updated key: {0}", key); … } //data set item is removed void OnQueryItemAdded(string key){ … Console.WriteLine("Added key: {0}", key); … } |
Und im Gegensatz zu SqlDependency NCache Die kontinuierliche Abfrage bleibt aktiv und wird nicht bei jeder Änderungsbenachrichtigung abgemeldet. So werden Ihre Echtzeitanwendungen mit hohem Datenverkehr weiterhin über mehrere Änderungen informiert.
NCache Continuous Query bietet Ihnen außerdem die Flexibilität, bei ADD, UPDATE und DELETE separat benachrichtigt zu werden. Und Sie können diese Ereignisse zur Laufzeit auch nach dem Erstellen einer kontinuierlichen Abfrage angeben, was Ihnen SqlDependency nicht erlaubt. Dadurch wird auch der Ereignisverkehr vom Cache-Cluster zu Ihrer Echtzeitanwendung reduziert.
Zusammenfassend, NCache bietet Ihnen eine sehr mächtige Ereignisgesteuerte kontinuierliche Abfrage das keine andere Datenbank hat. Und, NCache ist auch linear skalierbar für Ihre Echtzeitanwendungen mit hohem Datenverkehr.
Laden Sie also eine voll funktionsfähige 60-Tage-Testversion von herunter NCache Enterprise und probiere es selbst aus.