복잡한 아키텍처가 있는 트랜잭션이 많은 애플리케이션의 경우 지속적으로 데이터를 교환하면 균일하지 않은 로드와 처리량 지연이 발생합니다. 크고 복잡한 비즈니스 애플리케이션에서 데이터 정제는 큰 과제입니다. 이를 충족하기 위해 스트림 처리는 데이터 스트림을 생성하여 특정 데이터 흐름을 정의하는 데 사용됩니다. 일반적인 스트림 애플리케이션은 새 이벤트를 생성하는 여러 생산자와 이러한 이벤트를 처리하는 일련의 소비자로 구성됩니다.
널리 사용되는 애플리케이션 중 하나는 게시자가 메시지를 입력하고 구독자가 구독한 메시지를 받는 Pub/Sub입니다. 그러나 스트림 처리에서 Pub/Sub는 구독자가 메시지를 받으면 애플리케이션이 더 이상 메시지를 유지하지 않는 것과 같은 몇 가지 제한 사항에 직면합니다. 따라서 나중에 다른 구독자가 게시자로부터 메시지를 원하면 이전 메시지는 존재하지 않습니다. 또한 수신 스트림 데이터의 경우 서버가 아닌 클라이언트 측(구독자)에서 데이터 필터링이 발생하므로 애플리케이션 아키텍처가 복잡해집니다.
이러한 Pub/Sub의 한계를 극복하기 위해 NCache 연속 쿼리를 사용하여 서버 측에서 데이터를 처리하는 효율적인 메커니즘과 함께 제공됩니다. 연속 쿼리를 사용하면 특정 기준을 충족하면서 캐시에 있는 데이터에서 발생하는 모든 변경 사항을 애플리케이션에 알릴 수 있습니다. 이 블로그는 스트림 처리를 위해 생성된 솔루션의 도움으로 스트림 처리에서 연속 쿼리를 사용하는 이점을 이해하는 데 도움이 됩니다. GitHub의.
스트림 처리를 위한 연속 쿼리 사용
이 솔루션은 온라인 구매를 위해 매일 수천 명의 고객을 처리하는 전자 상거래 애플리케이션을 설명합니다. 아래 다이어그램을 보면 모든 종류와 범주의 고객이 애플리케이션에 추가됩니다. 효율적인 고객 처리를 위해 필터링되지 않은 고객은 연속 쿼리를 사용하여 주문 건수를 기준으로 "Gold", "Silver" 및 "Bronze" 고객으로 분류 및 필터링됩니다.
연속 쿼리 캐시 내에서 특정 기준을 충족하는 데이터가 변경되고 SQL 명령을 사용하여 기준이 지정되면 응용 프로그램이 알림을 받을 수 있습니다. 예를 들어 애플리케이션이 주문 수가 많은 고객을 '골드 고객'으로 태그 지정하려는 경우 SQL 명령 기준을 등록하여 콜백을 제공하기만 하면 됩니다. 이 콜백은 기준을 충족하는 결과 집합에서 발생하는 모든 변경에서 시작됩니다. 콜백이 호출되면 애플리케이션은 태그를 사용하여 이러한 고객을 "골드 고객"으로 분류할 수 있습니다.
마찬가지로 응용 프로그램은 각각 고유한 기준과 콜백이 있는 여러 CQ를 등록하여 여러 범주를 만들 수 있습니다. 이러한 방식으로 애플리케이션은 관심 있는 필터링된 데이터만 가져옵니다. 그런 다음 필터링된 데이터는 고객 범주에 따라 고급 고객에게 할인을 제공하는 것과 같은 비즈니스 요구 사항에 따라 추가로 분석할 수 있습니다.
다음 데이터 수정 작업이 캐시에서 발생하는 경우 이벤트가 트리거됩니다.
- 추가 : 쿼리 기준을 충족하는 캐시에 새 항목 추가
- 업데이트 : 쿼리 결과 집합에서 기존 항목을 업데이트합니다.
- 풀다: 캐시에서 항목을 제거하거나 쿼리 결과 집합에서 항목이 제거되도록 기존 캐시된 항목을 업데이트합니다.
연속 쿼리로 캐시에서 스트림 처리를 사용하는 간단한 코드 예제를 살펴보겠습니다. 이 예제에서는 10개보다 큰 주문이 "골드 고객" 범주에 추가되는 데이터에 대해 연속 쿼리가 실행됩니다. 또한 쿼리 결과 집합에 추가된 모든 항목에 대해 이벤트가 트리거됩니다.
1 2 3 4 5 6 7 8 9 10 11 |
string query = SELECT $VALUE$ FROM Models.Customer WHERE OrdersCount >= ?; var queryCommand = new QueryCommand (query); queryCommand.Parameters.Add("OrdersCount", 10); var contQuery = new ContinuousQuery (queryCommand); // EventDataFilter.None returns the cache keys added cQuery.RegisterNotification (new QueryDataNotificationCallback (QueryItemCallBackForGoldCustomers), EventType.ItemAdded, EventDataFilter.None); cache.MessagingService.RegisterCQ(contQuery); // Register callback for event notifications in the result set |
연속 쿼리는 Pub/Sub가 보관하지 않는 데이터를 보관합니다.
이제 연속 쿼리를 통해 필터링된 데이터(주문이 10개 이상인 고객의 경우)는 "골드 고객"으로 태그가 지정되고 캐시에서 업데이트됩니다. 아래 코드를 보고 어떻게 수행되는지 확인하십시오.
1 2 3 4 5 6 7 8 9 10 |
// A callback for previously executed query private void QueryItemCallBackForGoldCustomers (string key, CQEventArg arg) { var cacheItem = _cache.GetCacheItem(key); cacheItem.Expiration = new Expiration(ExpirationType.None); Tag[] tags = new Tag[1]; tags[0] = new Tag("GoldCustomers"); cacheItem.Tags = tags; cache.Insert(key, cacheItem); } |
연속 쿼리는 처리 후에도 데이터를 캐시에 보존합니다. 이러한 방식으로 데이터를 게시하는 여러 애플리케이션인 지속적으로 발생하는 데이터에 대해 Pub/Sub가 직면한 문제를 해결합니다. NCache 메시징 레이어. 따라서 여러 가입자가 데이터를 수신하고 메시지가 일단 수신되면 메시지 버스에서 제거되므로 신뢰할 수 있는 데이터 스토리지가 없습니다. 데이터는 애플리케이션에 의해 저장되거나 훨씬 더 복잡한 시나리오인 새 데이터 소스를 추가하여 저장됩니다. 반면 연속 쿼리는 데이터 손실이 없는지 확인하므로 데이터를 수동으로 유지하는 모든 추가 노력을 절약할 수 있습니다.
지속적인 쿼리는 강력한 필터링을 통해 애플리케이션 디커플링을 가능하게 합니다.
크고 복잡한 애플리케이션은 아키텍처를 기반으로 다양한 그룹화를 가질 수 있습니다. 예를 들어 10개의 애플리케이션이 실행 중이고 그 중 두 개는 골드 고객의 데이터 세트를 처리하고 다른 두 개는 실버 고객의 데이터 세트를 처리할 수 있습니다. 이러한 경우 스트림 처리에 대한 각 애플리케이션의 요구 사항에 따라 데이터가 필터링되는 각 데이터 세트에 대해 별도의 비즈니스 로직이 필요합니다. 따라서 이러한 크고 복잡한 응용 프로그램은 서로에 대한 응용 프로그램의 종속성이 엄청난 성능 병목 현상을 일으키고 응용 프로그램의 복잡성을 증가시키므로 분리가 필요합니다.
연속 쿼리는 상당히 정교한 SQL 문을 사용하여 애플리케이션의 데이터를 매우 효율적으로 필터링하므로 애플리케이션이 다른 애플리케이션과 겹치지 않습니다. 이 분리는 각 서비스가 별도의 애플리케이션 스택에서 실행되는 마이크로서비스 아키텍처에서 매우 유용합니다. 모든 마이크로 서비스는 종속성을 발생시키지 않고 자체 데이터를 가져오고 처리합니다. 이 수준의 데이터 필터링 및 애플리케이션 분리는 Pub/Sub를 사용하여 달성할 수 없습니다.
그림 2는 분리된 아키텍처에서 각각의 데이터 세트를 다루는 다양한 클라이언트 애플리케이션을 보여줍니다 NCache 지속적인 쿼리.
태그를 사용하여 데이터 가져오기
태그 in NCache 데이터를 기반으로 데이터를 분류하는 데 사용되는 데이터에 대한 추가 한정자입니다. 언급된 시나리오와 같은 대규모 데이터 세트의 경우 태그는 데이터에 대한 전체 캐시를 검색하는 대신 관련 데이터를 가져오는 데 정말 유용합니다. 고객이 "골드 고객" 범주에 속하는 경우 빠른 검색을 위해 태그가 추가됩니다. 이러한 카테고리에 따라 할인, 쿠폰 등의 추가 혜택을 고객에게 제공할 수 있습니다. NCache 다양한 제공 태그를 사용하여 데이터를 가져오는 유연한 방법, 설명서에 자세히 설명되어 있습니다.
이제 "Gold Customers"와 관련된 태그의 코드 예제를 살펴보겠습니다. 이러한 고객은 쿠폰 또는 프리미엄 서비스를 제공받을 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 |
string key = $"Customers:{customer.CustomerID}"; var cacheItem = new CacheItem (customer); Tag[] tags = new Tag[2]; tags[0] = new Tag ("Gold Customers");] cacheItem.Tags = tags; CacheItemVersion version = cache.Insert(key, cacheItem); // Retrieve the cache items with the tag for processing ICollection retrievedKeys = cache.SearchService.GetKeysByTag(tags[0]); |
캐시 데이터 만료
NCache 수 캐시 데이터 만료 특정 간격 후에 데이터를 무효화한 다음 깨끗한 간격으로 캐시에서 제거합니다.
NCache 두 가지 유형의 만료를 제공합니다.
고객의 경우 골드, 실버, 브론즈 4가지 범주에 해당되지 않는 항목에 만료가 추가됩니다. 주문이 15개 미만인 다른 모든 고객은 만료 시간 간격으로 추가되고 추가 분석을 위해 캐시에서 제거됩니다. 그러나 범주 중 하나에 속하는 고객의 만료는 수동으로 제거하지 않는 한 데이터를 캐시에 유지하기 위해 없음으로 설정됩니다. 주문이 4건 미만인 고객에게 XNUMX초 만료를 추가하는 방법입니다.
1 2 3 4 5 |
var cacheItem = new CacheItem(customers[0]); // Set Expiration TimeSpan cacheItem.Expiration = new Expiration(ExpirationType.Sliding, new TimeSpan(0, 0, 15)); cache.Insert("CustomerID:" + customers[0].Id, cacheItem); |
사용하는 이유 NCache?
NCache is 100% .NET/.NET 핵심 인메모리 분산 캐싱 솔루션으로 오랫동안 시장을 선도하고 있습니다. 매우 빠르고 선형적으로 확장 가능하며 데이터를 캐싱하여 애플리케이션의 성능 병목 현상을 효율적으로 제거합니다. 값비싼 네트워크 트립을 줄임으로써 네트워크 비용을 절약할 수 있습니다. NCache 애플리케이션의 원활한 흐름을 촉진하는 다른 기능과 함께 데이터 분석을 매우 빠르고 효율적으로 만드는 연속 쿼리와 같은 다양한 기능 세트를 제공합니다.