Jeden Tag generieren und verbrauchen wir immer mehr Daten. Für Unternehmen hat die Geschwindigkeit der Datenverarbeitung Einfluss auf ihre Entscheidungen. Da die Nachfrage nach effizienter Datenverarbeitung wächst, muss unsere Software mit dieser Nachfrage Schritt halten. Lange Umfragen sind nicht einfach eine Alternative. Schauen wir uns eines an NCache Funktion „Continuous Query“, die zur Unterstützung der Datenverarbeitung in Echtzeit entwickelt wurde.
Kontinuierliche Abfrage
Mit kontinuierlicher Abfrage, NCache Bietet einen Mechanismus zur Überwachung eines beobachtbaren Datensatzes innerhalb eines bestimmten Zeitfensters. Hier entlang, NCache Benachrichtigt uns über alle Änderungen, die an diesem Datensatz vorgenommen werden, während er zwischengespeichert wird. Continuous Query dient als Mechanismus zur Überwachung von Änderungen und nicht zur Änderung von Anwendungsdaten.
Dank ihrer verteilte Architektur, NCache bietet Skalierbarkeit, hohe Verfügbarkeit und Speichereffizienz. Mit seiner selbstheilenden Peer-to-Peer-Clustering-Architektur NCache verarbeitet große Mengen eingehender Daten für die Echtzeit-Datenverarbeitung.
So implementieren Sie eine kontinuierliche Abfrage
Mit kontinuierlichen Abfragen, NCache überwacht das Ergebnis einer Abfrage. Und im Gegensatz zu relationalen Datenbanken können Sie Elemente mithilfe einer SQL-ähnlichen Abfrage durchsuchen. NCache erfordert Indizes. Andernfalls müsste der gesamte Cache durchsucht werden, um Elemente zu finden, die wir überwachen möchten. Es wird machen NCache langsam.
Eine einfache Möglichkeit, die Einträge, die wir durchsuchen möchten, zu indizieren, besteht darin, Attribute wie hinzuzufügen QueryIndexable und QueryIndexed zu unseren Klassen und Eigenschaften. Lassen Sie uns beispielsweise die Anzahl der fehlerhaften Teile überwachen, die von einem bestimmten Maschinenmodell nach einigen Wartungsarbeiten erstellt wurden. Um unsere zwischengespeicherten Messungen nach Maschinenmodell zu durchsuchen, kommentieren wir unsere Measurement
Klasse so:
1 2 3 4 5 6 7 8 9 |
using Alachisoft.NCache.Runtime.Caching; namespace Acme.Monitoring.CacheItems; public class Measurement { [QueryIndexed] public string MachineModel { get; set; } public int LastFailedPartCount { get; set; } public DateTimeOffset At { get; set; } } |
Schritt 1: Abfrage und Benachrichtigungen registrieren
Als nächstes installieren wir das Alachisoft.NCache.SDK
NuGet-Paket zum Definieren einer Abfrage zum Überwachen und Registrieren einer Benachrichtigung für Änderungen in unseren Cache-Einträgen.
Zum Beispiel innerhalb eines ASP.NET Core Wenn Sie einen gehosteten Dienst oder einen anderen Hintergrundprozessor verwenden, schreiben wir eine Abfrage und eine Benachrichtigung, um die Messungen aller Maschinen mit einem bestimmten Modell zu überwachen. Etwas wie das:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// 1. Define a continuous query var queryText = "SELECT $VALUE$ FROM Acme.Monitoring.CacheItems.Measurement WHERE MachineModel = ?"; // Inside our query text, we need to fully qualify our objects var queryCommand = new QueryCommand(queryText); queryCommand.Parameters.Add("MachineModel", "ACME-001"); var query = new ContinuousQuery(queryCommand); // 2. Register the notification query.RegisterNotification( callback: new QueryDataNotificationCallback(OnQueryResultSetChanged), eventType: EventType.ItemAdded | EventType.ItemUpdated, datafilter: EventDataFilter.DataWithMetadata); // 3. Register the continuous query ICache cache = CacheManager.GetCache("demoCache"); cache.MessagingService.RegisterCQ(query); |
Beachten Sie, dass wir eine kontinuierliche Abfrage mit einem SQL-ähnlichen Abfragetext, einem Abfragebefehl und einem Parameter geschrieben haben. Wir mussten den Namen unseres Objekts im Abfragetext vollständig qualifizieren.
Im Abfragetext haben wir das verwendet $VALUE$
Projektion, um das tatsächlich im Cache gespeicherte Objekt abzurufen, nicht nur eine seiner Eigenschaften. NCache unterstützt andere Projektionen um Tags, Gruppen und das Ergebnis von Projektionsfunktionen wie abzurufen SUM
, MIN
und MAX
.
Anschließend haben wir eine Benachrichtigung registriert, die einen Rückruf, einen Ereignistyp und einen Datenfilter übergibt. Beachten Sie, dass wir denselben Rückruf für zwei Ereignistypen registriert haben. Mit dem Ereignistypparameter geben wir das Ereignis an, das wir überwachen möchten. NCache unterstützt drei Ereignistypen: ItemAdded
, ItemUpdated
und ItemRemoved
. Und mit dem Datenfilterparameter geben wir die Informationen an, die wir in unserem Rückruf haben möchten, sobald ein Ereignis ausgelöst wird. NCache unterstützt drei Datenfilter:
1. Keine: Es wird nur der Schlüssel des hinzugefügten, aktualisierten oder entfernten Eintrags zurückgegeben.
2. Metadaten: Es werden der betroffene Schlüssel und die Metadaten wie Gruppenname, Elementpriorität und Elementversion zurückgegeben.
3.DataWithMetadata: Es gibt den Cache-Eintrag und die zugehörigen Metadaten zurück.
In unserem Beispiel wird jedes Mal, wenn wir eine Messung für eine Maschine mit dem Modell „ACME-001“ hinzufügen oder aktualisieren, NCache ruft die OnQueryResultSetChanged
-Methode, die den tatsächlich hinzugefügten oder aktualisierten Eintrag übergibt. Wir verwendeten ItemAdded
und EventType.ItemUpdated
als Veranstaltungstyp und DataWithMetadata
als Datenfilter.
Das DataWithMetadata
ist hilfreich, um zu vermeiden, dass Elemente innerhalb des Rückrufs erneut per Schlüssel abgerufen werden. Aber nutzen wir es vorsichtig, denn es ist eine teure Netzwerkreise.
Schritt 2: Rückrufe für Veranstaltungen registrieren
Einer der Parameter, die wir beim Registrieren einer Benachrichtigung übergeben, ist a callback . Dies ist die Aktion, die wir ausführen möchten, sobald ein Element, das unsere „Überwachungs“-Abfrage erfüllt, von dem von uns registrierten Ereignistyp betroffen wird.
Um mit unserem Beispiel fortzufahren: Dies ist ein Rückruf zum Anhören ItemAdded
und ItemUpdated
Ereignisse:
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 |
public void OnQueryResultSetChanged(string key, CQEventArg arg) { switch (arg.EventType) { case EventType.ItemAdded: // A new measurement for an ACME-001 machine was added // Do something here... Console.WriteLine($"Item with key '{key}' has been added to result set of continuous query"); break; case EventType.ItemUpdated: // A measurement for an ACME-001 machine was changed Console.WriteLine($"Item with key '{key}' has been updated in the result set of the continuous query"); // Since we passed DataWithMetadata, we have access to the cache entry itself if (arg.Item != null) { var old = arg.OldItem.GetValue<Measurement>() var updated = arg.Item.GetValue<Measurement>(); // Do something here with old and updated // Send a notification, push a message into a topic... Console.WriteLine($"Updated product '{key}' has '{updatedMeasurement.FailPartCount}'"); } break; } } |
Wenn dieser Rückruf aktiviert ist, können wir damit beginnen, Messungen von unseren Maschinen in unseren Cache aufzunehmen. NCache überwacht Cache-Elemente und teilt uns mit, wenn eine Messung mit dem Modell „ACME-001“ hinzugefügt oder aktualisiert wird. Anschließend können wir eine E-Mail senden oder eine Warnung generieren, wenn die Anzahl der ausgefallenen Maschinen einen Schwellenwert überschreitet.
Schritt 3: Abfrage und Benachrichtigungen abmelden
Die Überwachung von Anfragen und die Benachrichtigung von Kunden sind mit einigen Kosten verbunden. Es wirkt sich jedoch nicht auf Cache-Clients aus, da es asynchron ausgeführt wird. Um kontinuierliche Abfragen besser zu nutzen, lassen Sie uns Benachrichtigungen abmelden und Abfragen, wenn wir unser Abfrageergebnis nicht mehr überwachen müssen, wie hier.
1 2 3 4 5 6 |
query.UnRegisterNotification( callback: new QueryDataNotificationCallback(OnQueryResultSetChanged), eventType: EventType.ItemAdded | EventType.ItemUpdated); ICache cache = CacheManager.GetCache("demoCache"); cache.MessagingService.UnRegisterCQ(query); |
Zusammenfassung
So implementieren Sie Continuous Query in .NET-Anwendungen. Bei einer kontinuierlichen Abfrage überwachen wir ein Abfrageergebnis innerhalb eines Zeitfensters auf Hinzufügungen, Änderungen und Löschungen. Hier haben wir ein Beispiel geschrieben, um die Anzahl ausgefallener Maschinenteile zu beobachten. Aber wir können Continuous Query für das Risikomanagement, die Betrugserkennung, die Protokollanalyse und andere Echtzeitszenarien verwenden.
Weitere Informationen zu Continuous Query finden Sie unter Überblick über kontinuierliche Abfragen -Guide.