매일 우리는 점점 더 많은 양의 데이터를 생성하고 소비합니다. 기업의 경우 데이터 처리 속도가 의사결정에 영향을 미칩니다. 효율적인 데이터 처리에 대한 요구가 증가함에 따라 우리의 소프트웨어는 그러한 요구를 따라잡아야 합니다. 롱 폴링은 단순한 대안이 아닙니다. 하나를 살펴보자 NCache 실시간 데이터 처리를 지원하도록 설계된 연속 쿼리 기능입니다.
연속 쿼리
연속 쿼리를 사용하면 NCache 특정 기간 내에 관찰 가능한 데이터 세트를 모니터링하는 메커니즘을 제공합니다. 이 방법, NCache 캐시되는 동안 해당 데이터 세트에 발생하는 모든 변경 사항에 대해 알려줍니다. 연속 쿼리는 애플리케이션 데이터를 변경하는 것이 아니라 변경 사항을 모니터링하는 메커니즘으로 작동합니다.
덕분에 그 분산 아키텍처, NCache 확장성, 고가용성, 스토리지 효율성을 제공합니다. 자가 치유 P2P 클러스터링 아키텍처를 통해 NCache 실시간 데이터 처리를 위해 대량의 수신 데이터를 처리합니다.
연속 쿼리를 구현하는 방법
연속 쿼리를 사용하면 NCache 쿼리 결과를 모니터링합니다. 그리고 관계형 데이터베이스와 달리 SQL과 같은 쿼리를 사용하여 항목을 검색하려면, NCache 인덱스가 필요합니다. 그렇지 않으면 모니터링하려는 항목을 찾기 위해 전체 캐시를 스캔해야 합니다. 그것은 만들 것이다 NCache 느린.
검색하려는 항목을 색인화하는 쉬운 방법 중 하나는 다음과 같은 속성을 추가하는 것입니다. 쿼리인덱싱 가능 와 쿼리인덱싱됨 우리의 클래스와 속성에. 예를 들어, 일부 유지 관리 작업 후에 특정 기계 모델에서 생성된 고장난 부품 수를 모니터링해 보겠습니다. 캐시된 측정값을 기계 모델별로 검색하려면 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$
프로젝션을 통해 해당 속성 중 하나뿐만 아니라 캐시 내부에 저장된 실제 개체를 검색할 수 있습니다. NCache 다른 지원 계획안 태그, 그룹 및 프로젝션 기능의 결과를 검색합니다. SUM
, MIN
및 MAX
.
그런 다음 콜백, 이벤트 유형 및 데이터 필터를 전달하는 알림을 등록했습니다. 두 가지 이벤트 유형에 대해 동일한 콜백을 등록했습니다. 이벤트 유형 매개변수를 사용하여 모니터링하려는 이벤트를 지정합니다. NCache 세 가지 이벤트 유형을 지원합니다. ItemAdded
, ItemUpdated
및 ItemRemoved
. 그리고 데이터 필터 매개변수를 사용하여 이벤트가 발생한 후 콜백 내부에 원하는 정보를 지정합니다. NCache 세 지원 데이터 필터:
1. 없음: 추가, 업데이트 또는 제거된 항목의 키만 반환합니다.
2. 메타데이터: 영향을 받은 키와 그룹 이름, 항목 우선순위, 항목 버전과 같은 메타데이터를 반환합니다.
3.데이터와메타데이터: 캐시 항목 및 관련 메타데이터를 반환합니다.
이 예에서는 "ACME-001" 모델이 있는 기계에 대해 하나의 측정값을 추가하거나 업데이트할 때마다 NCache 전화 OnQueryResultSetChanged
메서드를 사용하여 추가되거나 업데이트된 실제 항목을 전달합니다. 우리는 사용했었다 ItemAdded
와 EventType.ItemUpdated
이벤트 유형과 DataWithMetadata
데이터 필터로.
XNUMXD덴탈의 DataWithMetadata
콜백 내에서 키로 항목을 다시 가져오는 것을 방지하는 데 도움이 됩니다. 하지만 네트워크 여행 비용이 많이 들기 때문에 조심해서 사용하자.
2단계: 이벤트에 대한 콜백 등록
알림을 등록하는 동안 전달하는 매개변수 중 하나는 콜백. 이는 "모니터링" 쿼리를 충족하는 항목이 우리가 등록한 이벤트 유형의 영향을 받을 때 수행하려는 작업입니다.
예제를 계속하려면 다음을 수신할 콜백입니다. 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 애플리케이션 내에서 연속 쿼리를 구현하는 방법입니다. 지속적인 쿼리를 통해 일정 기간 동안 추가, 변경, 삭제에 대한 쿼리 결과를 모니터링합니다. 여기서는 기계의 고장난 부품 수를 확인하는 예제를 작성했습니다. 그러나 위험 관리, 사기 탐지, 로그 분석 및 기타 실시간 시나리오에는 연속 쿼리를 사용할 수 있습니다.
연속 쿼리에 대해 자세히 알아보려면 다음을 확인하세요. 연속 쿼리 개요 안내서.