私たちは毎日、増加する量のデータを生成および消費します。企業にとって、データ処理の速度は意思決定に影響を与えます。効率的なデータ処理に対する需要が高まるにつれ、当社のソフトウェアもその需要に対応する必要があります。ロングポーリングは単なる代替手段ではありません。一つ見てみましょう NCache リアルタイム データ処理をサポートするように設計された連続クエリ機能。
連続クエリ
継続的クエリを使用すると、 NCache 特定の時間枠内で観察可能なデータセットを監視するメカニズムを提供します。こちらです、 NCache データセットがキャッシュされている間にそのデータセットに発生したすべての変更について通知します。継続的クエリは、アプリケーション データを変更するのではなく、変更を監視するメカニズムとして機能します。
そのおかげ 分散アーキテクチャ, NCache スケーラビリティ、高可用性、ストレージ効率を提供します。自己修復ピアツーピア クラスタリング アーキテクチャにより、 NCache リアルタイムのデータ処理のために大量の受信データを処理します。
継続的クエリの実装方法
継続的なクエリでは、 NCache クエリの結果を監視します。また、リレーショナル データベースとは異なり、SQL のようなクエリを使用して項目を検索するには、 NCache インデックスが必要です。それ以外の場合は、監視する項目を見つけるためにキャッシュ全体をスキャンする必要があります。それは作ります NCache スロー。
検索したいエントリにインデックスを付ける簡単な方法の 1 つは、次のような属性を追加することです。 クエリインデックス可能 & クエリインデックス付き 私たちのクラスとプロパティに。たとえば、メンテナンス作業後に特定のマシン モデルによって作成された故障部品の数を監視してみましょう。キャッシュされた測定値をマシンモデルごとに検索するには、注釈を付けてみましょう。 Measurement
このようなクラス:
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; } } |
ステップ1:クエリと通知を登録する
次に、インストールしましょう Alachisoft.NCache.SDK
NuGet パッケージを使用して、キャッシュ エントリの変更の通知を監視および登録するためのクエリを定義します。
たとえば、ASP 内で.NET Core ホストされたサービスやその他のバックグラウンド プロセッサを使用する場合は、特定のモデルを持つすべてのマシンの測定値を監視するためのクエリと通知を作成してみましょう。このようなもの:
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); |
SQL のようなクエリ テキスト、クエリ コマンド、パラメータを使用して連続クエリを作成したことに注目してください。クエリ テキスト内のオブジェクトの名前を完全修飾する必要がありました。
クエリテキストでは、 $VALUE$
プロジェクションを使用して、そのプロパティの 1 つだけでなく、キャッシュ内に格納されている実際のオブジェクトを取得します。 NCache その他をサポート 予測 タグ、グループ、および次のような射影関数の結果を取得します。 SUM
, MIN
, MAX
.
次に、コールバック、イベント タイプ、データ フィルターを渡す通知を登録しました。 2 つのイベント タイプに同じコールバックを登録したことに注目してください。イベント タイプ パラメータを使用して、監視するイベントを指定します。 NCache 次の 3 つのイベント タイプをサポートします。 ItemAdded
, ItemUpdated
, ItemRemoved
。また、データ フィルター パラメーターを使用して、イベントが発生した後のコールバック内に必要な情報を指定します。 NCache 3つをサポート データフィルター:
1.なし: 追加、更新、または削除されたエントリのキーのみを返します。
2.メタデータ: 影響を受けるキーと、グループ名、アイテムの優先度、アイテムのバージョンなどのメタデータを返します。
3.メタデータ付きデータ: キャッシュ エントリと関連するメタデータを返します。
この例では、モデル「ACME-001」のマシンの測定値を XNUMX つ追加または更新するたびに、 NCache その OnQueryResultSetChanged
メソッドに、追加または更新された実際のエントリを渡します。私たちが使用した ItemAdded
& EventType.ItemUpdated
イベントタイプとして、 DataWithMetadata
データフィルターとして。
DataWithMetadata
これは、コールバック内でキーによって項目を再度フェッチすることを避けるのに役立ちます。ただし、高価なネットワーク旅行なので慎重に使用しましょう。
ステップ 2: イベントのコールバックを登録する
通知の登録時に渡すパラメータの 1 つは、 折り返し電話。これは、「監視」クエリを満たす項目が登録したイベント タイプの影響を受けたときに実行するアクションです。
例を続けると、これはリッスンするコールバックです。 ItemAdded
& ItemUpdated
イベント:
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; } } |
このコールバックを設定すると、マシンからキャッシュへの測定値の取り込みを開始できます。 NCache はキャッシュ項目を監視し、モデル「ACME-001」の測定値が追加または更新されたときに通知します。その後、マシンの失敗数がしきい値を超えた場合に、電子メールを送信したり、アラートを生成したりできます。
ステップ 3: クエリと通知の登録を解除する
クエリの監視とクライアントへの通知には、ある程度のコストがかかります。ただし、非同期で実行されるため、キャッシュ クライアントには影響しません。継続的クエリをより効果的に使用するには、次のことを行いましょう 通知の登録を解除する このように、クエリ結果を監視する必要がなくなったときにクエリを実行します。
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); |
まとめ
これが、.NET アプリケーション内で継続的クエリを実装する方法です。継続的なクエリでは、一定の時間枠内でクエリ結果の追加、変更、削除を監視します。ここでは、マシンの故障した部品の数を監視する例を作成しました。ただし、継続的クエリは、リスク管理、不正検出、ログ分析、その他のリアルタイム シナリオに使用できます。
継続的クエリの詳細については、 連続クエリの概要 ガイド。