이 기사에서는 분산 캐싱 솔루션이 어떻게 마이크로서비스 기반 애플리케이션의 전체 성능과 처리량을 크게 향상시킬 수 있는지 살펴보겠습니다.
일반적인 마이크로서비스 기반 애플리케이션에서 여러 마이크로서비스는 느슨하게 결합되고 확장 가능한 상태를 유지하면서 함께 작동합니다. 애플리케이션에는 중요한 비즈니스 데이터를 추적하고 처리하는 것과 같은 핵심 비즈니스 요구 사항을 충족하는 데 필요한 서비스가 있습니다. ID 및 인증, 상태 및 부하 모니터링을 처리하고 API 게이트웨이 역할을 하는 추가 전용 마이크로서비스도 있습니다.
이러한 애플리케이션의 핵심 기능은 원하는 기술 스택을 사용하여 각 마이크로 서비스를 독립적으로 설계, 개발 및 배포한다는 것입니다. 각 마이크로서비스는 그 자체로 독립 실행형 자율 앱이기 때문에 별도의 영구 스토리지도 유지합니다. NoSQL DB 또는 레거시 파일 스토리지 시스템. 이를 통해 개별 마이크로서비스를 독립적으로 확장하고 실시간 인프라 변경을 훨씬 더 쉽게 관리할 수 있습니다.
NCache 세부 정보 마이크로서비스 NCache 마이크로서비스에서 Pub/Sub 확장
마이크로서비스가 필요한 이유 NCache?
애플리케이션에서 트랜잭션이 증가하는 동안 여전히 병목 현상이 발생하는 경우가 있습니다. 이는 마이크로 서비스가 확장을 허용하지 않는 관계형 데이터베이스에 데이터를 저장하는 아키텍처에서 주로 일반적입니다. 이러한 상황에서 더 많은 인스턴스를 배포하여 마이크로 서비스를 확장해도 문제가 해결되지 않습니다.
이러한 문제에 대응하기 위해 원활하게 도입할 수 있습니다. NCache 마이크로 서비스와 데이터 저장소 사이의 캐싱 계층에서 분산 캐시로. NCache 또한 메모리 내 확장 가능한 게시자/구독자 메시징 브로커로서 마이크로 서비스 간의 비동기 통신을 허용하는 데 도움이 됩니다.
Pub/Sub를 통한 확장성
마이크로 서비스 통신은 느슨하게 결합된 상태로 유지하면서 마이크로 서비스 간의 메시징을 허용하는 게시자/구독자 모델을 사용하여 자주 구현됩니다. 그런 점에서, NCache 애플리케이션을 구성하는 모든 마이크로서비스가 이벤트를 게시하고 구독할 수 있는 메모리 내 확장 가능한 Pub/Sub 메시징 브로커 역할을 합니다. 고유한 확장성 및 안정성 기능 NCache 클러스터링은 pub/sub에 올 때 자동으로 번역됩니다. 에 대해 자세히 알아보기 NCache 블로그를 통해 마이크로서비스 환경에서 메시지 브로커로 메모리 내 Pub/Sub를 사용한 .NET 마이크로서비스 통신 확장.
NCache 세부 정보 Pub/Sub 메시징 NCache 마이크로서비스에서 Pub/Sub 확장
캐싱을 통한 확장성
NCache 실시간 확장성을 제공하여 애플리케이션 중단 시간 없이 실행 중인 캐시 클러스터에 원하는 만큼 서버 노드를 추가할 수 있습니다. 사용 NCache 빠른 인 메모리 저장소 역할을 하여 개별 마이크로 서비스의 전반적인 성능을 향상시킬 뿐만 아니라 클러스터링 아키텍처를 통해 애플리케이션 응답 시간 및 가용성을 현저하게 증가시킵니다. 이는 여러 호스트에 분산된 수십 개의 마이크로 서비스와 관련된 워크플로를 고려할 때 특히 그렇습니다.
이용 방법 NCache 데이터 캐싱을 위해?
와 NCache 마이크로서비스에 데이터가 필요한 경우 매번 데이터베이스에 직접 액세스하는 대신 먼저 캐시를 확인합니다. 가장 자주 액세스되는 데이터가 일반적으로 데이터 저장소에서 사용 가능한 전체 데이터의 작은 부분을 차지한다는 점을 감안할 때 해당 데이터를 이미 캐시하고 사용할 수 있으면 데이터베이스 관련 대기 시간이 크게 줄어들고 대부분의 경우 데이터베이스에 대한 로드가 쉬워집니다. 의 데이터 요청은 캐시 자체에서 처리합니다.
마이크로서비스 기반 애플리케이션이 모놀리식 설계 구조를 사용하여 구축할 때보다 본질적으로 느린 것을 보면 NCache. NCache, 마이크로서비스 수준에서 순차적으로 작동하는 여러 서비스에 걸쳐 있는 긴 트랜잭션 중에 관찰되는 전체 대기 시간을 줄이면서 마이크로서비스 아키텍처의 기능을 활용하는 데 도움이 될 수 있습니다.
NCache 에는 캐싱 작업을 세밀하게 제어할 수 있는 몇 가지 즉시 사용 가능한 기능이 있습니다. 이러한 작업에는 만료 및 데이터베이스 동기화를 사용한 캐시 일관성 강화, 지원 소스 공급자를 사용하여 캐시 배제 및 캐시 통과 기능을 구현하는 데 도움이 되는 풍부한 API가 포함됩니다. NCache 또한 SQL 쿼리를 사용하여 캐시에서 SQL과 유사한 쿼리 작업을 제공하고 EF Core와 같은 ORM(개체 관계형 매퍼)에 대한 캐싱 공급자 역할을 합니다.
시작하려면 NCache 마이크로서비스 기반 애플리케이션에서 가장 먼저 필요한 것은 서비스를 구성하는 것입니다. 이것은 마이크로 서비스가 사용을 시작하는 데 필요한 필수 정보를 제공합니다. NCache. 상호 컨텍스트를 만드는 방법에 대한 개요 NCache 마이크로서비스 기반 애플리케이션은 아래와 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public IServiceProvider ConfigureServices(IServiceCollection services) { //Add additional code here services.AddDbContext<CatalogContext>(options => { var cacheID = configuration["CatalogCache"]; if (string.IsNullOrEmpty(cacheID)) cacheID = "CatalogCache"; NCacheConfiguration.Configure(cacheID, DependencyType.Other); // Changing default behavior when client evaluation occurs to throw. // Default in EF Core would be to log a warning when client evaluation is performed. options.ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning)); //Check Client vs. Server evaluation: https://docs.microsoft.com/en-us/ef/core/querying/client-eval }); var container = new ContainerBuilder(); container.Populate(services); return new AutofacServiceProvider(container.Build()); } |
지금 해야 할 일은 캐시에서 항목을 찾으면 항목을 가져올 수 있는 논리를 사용하여 컨트롤러를 배포하는 것입니다. 그렇지 않은 경우 컨트롤러는 데이터베이스에서 항목을 가져와 캐시에 저장합니다. 이러한 컨트롤러의 구현은 다음과 같습니다.
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 41 42 43 44 |
[Route("api/v1/[controller]")] [ApiController] public class CatalogController : ControllerBase { private readonly CatalogContext _catalogContext; private readonly CatalogSettings _settings; private readonly ICatalogIntegrationEventService _catalogIntegrationEventService; public CatalogController(CatalogContext context, IOptionsSnapshot<CatalogSettings> settings, ICatalogIntegrationEventService catalogIntegrationEventService) { _catalogContext = context ?? throw new ArgumentNullException(nameof(context)); _catalogIntegrationEventService = catalogIntegrationEventService ?? throw new ArgumentNullException(nameof(catalogIntegrationEventService)); _settings = settings.Value; } [HttpGet] [Route("items/{id:int}")] [ProducesResponseType((int)HttpStatusCode.NotFound)] [ProducesResponseType((int)HttpStatusCode.BadRequest)] [ProducesResponseType(typeof(CatalogItem), (int)HttpStatusCode.OK)] public async Task<ActionResult<CatalogItem>> ItemByIdAsync(int id) { if (id <= 0) { return BadRequest(); } CatalogItem item = null; var cache = _catalogContext.GetCache(); string catalogItemKey = "CatalogItem:" + id; //Getting item from cache item = cache.Get<CatalogItem>(catalogItemKey); if (item == null) { item = await _catalogContext.CatalogItems.SingleOrDefaultAsync(ci => ci.Id == id); cache.Insert(catalogItemKey, item); } // Your logic here if (item != null) return item; return NotFound(); } } |
이들의 디테일을 살펴보며 진정한 매력을 알아가 보자. NCache 마이크로서비스에서.
캐시를 항상 최신 상태로 유지
기본 기본 데이터 저장소의 콘텐츠와 비교할 때 "부실" 데이터를 유지하는 캐시와 관련된 캐시를 사용할 때 주의해야 할 중요한 사항이 있습니다. 특정 마이크로서비스가 캐시에서 최신 데이터를 수신하도록 하려면 캐시 데이터를 정기적으로 업데이트해야 합니다. 다행스럽게도, NCache 와 같은 기능을 제공합니다 데이터베이스 동기화 과 만료 데이터가 기본 데이터 저장소의 데이터와 일관성을 유지하도록 합니다.
캐시된 항목에 만료 시간 간격을 추가하기만 하면 데이터 저장소와 캐시의 동기화 수준을 유지할 수 있습니다. 만료되면, NCache 동일한 정보에 대한 후속 요청으로 인해 업데이트된 데이터가 캐시되도록 캐시된 항목을 제거합니다. NCache 둘 다 제공 절대 만큼 잘 미끄러 져 움직이는 만료 전략 및 해당 데이터의 일시적인 특성에 따라 둘 중 하나를 사용할 수 있습니다.
예를 들어, 다음 코드 스니펫은 특정 캐시 항목에 대한 절대 만료를 얼마나 쉽게 도입할 수 있는지 보여줍니다.
1 2 3 4 |
var cacheItem = new CacheItem(product); var expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); cacheItem.Expiration = expiration; cache.Insert(key, cacheItem); |
슬라이딩 만료를 사용하려면 ExpirationType을 다음과 같이 변경하기만 하면 됩니다.
1 |
var expiration = new Expiration(ExpirationType.Sliding, TimeSpan.FromMinutes(5)); |
캐시 데이터 일관성을 유지하기 위해 캐시에서 만료를 설정할 때 주요 요구 사항은 만료 시간 설정이 특정 데이터 조각이 데이터 저장소 측에서 변경되는 속도에 따라야 한다는 것입니다. 만료 시간을 너무 짧게 설정하면 데이터가 불필요하게 제거될 수 있으며 불필요하고 비용이 많이 드는 데이터 저장소 이동이 발생합니다. 만료 시간이 너무 길면 오래된 데이터가 사용될 수 있습니다.
따라서 만료 시간에 대한 최적 값을 찾으려면 일반적으로 실현 가능하지 않은 데이터 상태 변경 패턴에 대한 깊은 지식이 필요합니다. 캐시 일관성 요구 사항이 더욱 엄격해지면 데이터베이스 동기화 전략이 권장되는 접근 방식입니다. NCache 이와 관련하여 여러 데이터베이스 동기화 전략을 제공합니다.
이를 사용하면 만료를 사용할 때 요구되는 각 정보 조각의 데이터 액세스 패턴으로 이동하지 않고도 캐시를 데이터 저장소와 동기화할 수 있습니다. 이제 데이터 저장소 측에서 해당 항목이 변경될 때마다 캐시는 추가 지연 없이 해당 항목을 자동으로 제거할 수 있습니다.
이 작업을 확인하기 위해 다음 코드 스니펫은 동기화 방법을 보여줍니다. NCache 추가하여 SQL Server 데이터베이스에 NCache SQL 종속성 캐시된 항목에.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Creating SQL Dependency string query = "SELECT ProductName, UnitPrice FROM dbo.Products WHERE CategoryID = 'Dairy';"; SqlCacheDependency sqlDependency = new SqlCacheDependency(connectionString, query); // Get orders that contain products with given category ID Order[] orders = FetchOrdersByProductCategoryID("Dairy"); foreach (var order in orders) { // Generate a unique cache key for this order string key = $"Order:ProductCategory-Dairy:{order.OrderID}"; // Create a new cacheitem and add sql dependency to it CacheItem item = new CacheItem(order); item.Dependency = sqlDependency; //Add cache item in the cache with SQL Dependency cache.Insert(key, item); } |
캐시에 대한 SQL 쿼리
NCache SQL과 유사한 쿼리 메커니즘을 통해 인덱싱된 캐시 데이터를 쿼리할 수 있는 기능을 마이크로 서비스에 제공합니다. 이 기능은 필요한 정보가 저장된 키 값을 알 수 없는 경우 유용합니다. 이것은 또한 많은 하위 수준 캐시 API 호출을 추상화하고 애플리케이션 코드를 훨씬 쉽게 이해하고 유지 관리할 수 있도록 합니다. 이 기능은 SQL과 같은 명령에 더 익숙한 사용자에게 고유하게 적합한 것으로 입증되었습니다.
사용을 보여주는 예제 코드 스니펫 NCache SQL 쿼리 기능은 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
string query = "SELECT * FROM FQN.Product WHERE ProductID > ?"; // Use QueryCommand for query execution var queryCommand = new QueryCommand(query); // Providing parameters for query queryCommand.Parameters.Add("ProductID",50000); // Executing QueryCommand through ICacheReader ICacheReader reader = cache.SearchService.ExecuteReader(queryCommand); // Check if the result set is not empty if (reader.FieldCount > 0) { while (reader.Read()) { string result = reader.GetValue<string>(1); // Perform operations using the retrieved keys } } else { // Null query result set retrieved } |
SQL 쿼리는 쿼리 인덱스와 함께 작동할 수 있습니다. NCache 분산 데이터 구조 및 캐시 태그. 에 대한 자세한 내용은 링크를 따르십시오. 어떻게 사용 하는가? NCache SQL 쿼리 기능.
Read-Thru 및 Write-Thru
사용법 - NCache 데이터 소스 공급자 기능, 세트 NCache 마이크로 서비스의 관점에서 데이터 액세스 계층에 대한 단일 항목으로 마이크로 서비스에 데이터가 필요한 경우 캐시에만 액세스하면 됩니다. 그런 다음 캐시에서 데이터를 사용할 수 있는 경우 데이터를 제공하지만 그렇지 않은 경우 클라이언트 대신 read-thru 처리기를 사용하여 데이터 저장소에서 데이터를 검색하고 캐시하고 마이크로서비스에 제공합니다.
마찬가지로 write-thru 핸들러를 활용하면 마이크로서비스가 캐시에서 쓰기 작업(추가, 업데이트, 삭제)만 실행하면 캐시가 데이터 저장소에서 관련 쓰기 작업을 자동으로 수행합니다.
또한 캐시가 오래된 버전을 보유하고 있는지 여부에 관계없이 캐시가 데이터 저장소에서 직접 데이터를 검색하도록 할 수도 있습니다. 이는 마이크로서비스가 최신 정보를 필요로 하고 앞에서 언급한 캐시 일관성 전략을 기반으로 하는 경우에 중요합니다.
백업 데이터 소스 공급자 기능은 애플리케이션 코드를 간소화할 뿐만 아니라 많은 NCache 데이터베이스 동기화 기능 사용 가능, 캐시는 계산 준비가 된 자동 다시 로드된 새로운 데이터와 함께 유지됩니다.
다음 코드 스니펫은 마이크로서비스에서 Read-Thru 사용을 시작하는 데 도움이 됩니다.
1 2 3 4 5 6 |
// Specify the readThruOptions for read through operations var readThruOptions = new ReadThruOptions(); readThruOptions.Mode = ReadMode.ReadThru; // Retrieve the data of the corresponding item with reads thru enabled Product data = cache.Get<Product>(key, readThruOptions); |
마찬가지로 다음을 사용하여 Write-Through를 구현할 수 있습니다.
1 2 3 4 5 6 |
// Enable write through for the cacheItem created var writeThruOptions = new WriteThruOptions(); writeThruOptions.Mode = WriteMode.WriteBehind; // Add item in the cache with write-behind cache.Insert(key, cacheItem, writeThruOptions); |
이러한 공급자를 사용하는 방법에 대한 자세한 내용은 다음 문서를 참조하십시오. 전체 읽기 캐싱 과 연속 기입 캐싱.
NCache 세부 정보 데이터 소스 공급자 NCache
EF 코어 캐싱
엔터티 프레임워크(EF) 코어 엔터프라이즈 .NET 애플리케이션에서 자주 사용되는 강력한 O/RM(Object Relational Mapper)입니다. 그리고 워낙 유명해서 NCache ~을 제공하다 EF Core 캐싱 공급자 FromCache와 같은 확장 메서드를 사용하여 EF Core 관련 코드 내에서 캐싱을 원활하게 추가할 수 있습니다.. 이를 통해 EF Core 개발자는 NCache API의 기능을 계속 사용할 수 있습니다. NCache.
다음 코드는 사용 편의성을 보여줍니다. NCache EF Core 캐싱 공급자는 기존 마이크로 서비스 애플리케이션 논리에 캐싱을 도입합니다.
1 2 3 4 5 6 7 8 9 |
var options = new CachingOptions { // To store the result as collection in cache StoreAs = StoreAs.Collection }; options.SetAbsoluteExpiration(DateTime.Now.AddMinutes(_settings.NCacheAbsoluteExpirationTime)); // Get items from cache. If not found, fetch from database and store in cache. item = await _catalogContext.CatalogItems.DeferredSingleOrDefault(ci => ci.Id == id).FromCacheAsync(options); |
EF Core Caching Provider API 및 비즈니스 사례에 도움이 되는 방법에 대한 자세한 정보는 다음에서 찾을 수 있습니다. NCache EF 핵심 공급자.
모두 합산
마이크로서비스는 자율적이어야 한다는 구체적인 의도로 구축되었습니다. 다른 마이크로 서비스와 독립적으로 개발, 테스트 및 배포할 수 있습니다. 이는 전체 애플리케이션을 고도로 확장 가능하게 할 뿐만 아니라 빠른 CI/CD(지속적 통합/지속적 배포) 프로세스에 개방되도록 합니다.
그러나 확장성 및 빠른 개발 수명 주기 측면에서 마이크로서비스가 제공하는 모든 이점에도 불구하고 장애를 일으키는 애플리케이션 스택의 특정 측면이 있습니다. 이러한 측면 중에는 부하 증가에 대처하는 데 필요한 확장을 허용하지 않는 관계형 데이터베이스가 있습니다. NCache 빛난다.
NCache 에는 마이크로서비스 애플리케이션에 쉽고 직관적으로 데이터 캐싱을 추가하는 데 도움이 되는 다양한 즉시 사용 가능한 기능이 있습니다. 여기에는 데이터베이스 동기화, 만료, EF Core 캐싱, SQL 쿼리 및 훨씬 더.