ASP.NET은 트래픽이 많은 웹 응용 프로그램을 개발할 때 개발자가 가장 많이 선택하는 도구가 되었습니다. 확장 가능한 특성으로 인해 ASP.NET 응용 프로그램 계층은 매일 수백만 건의 요청이 있는 수천 명의 동시 사용자를 원활하게 처리할 수 있습니다. 이러한 트래픽이 많은 ASP.NET 애플리케이션은 로드 밸런서가 있는 로드 밸런싱된 웹 팜에 배포되어 사용자 요청을 여러 웹 서버로 라우팅합니다.
ASP.NET 응용 프로그램 계층은 트랜잭션 부하가 높은 경우에도 예외적으로 잘 수행되지만 응용 프로그램은 다른 영역에서 몇 가지 중요한 확장성 병목 현상에 직면합니다. 이러한 병목 현상은 ASP.NET 응용 프로그램의 속도를 늦출 수 있으며 비즈니스 활동이 최고조에 달할 때 중단될 수도 있습니다.
문제: XNUMX가지 성능 병목 현상
이 네 가지 ASP.NET 성능 병목 현상은 아래에 설명되어 있습니다.
데이터베이스 병목 현상
로드 밸런싱된 웹 팜에서는 트랜잭션 로드가 증가할 때 더 많은 웹 서버를 추가하여 선형적으로 확장할 수 있습니다. 그러나 같은 방식으로 데이터베이스 계층(SQL Server, Oracle 등)에 데이터베이스 서버를 더 추가할 수는 없습니다. 따라서 데이터베이스가 느려지기 시작하고 한 지점에서 충돌할 수도 있습니다. 이 고장은 애플리케이션이 직면한 가장 중요한 성능 병목 현상입니다.
ASP.NET 세션 상태 저장소 병목 현상
ASP.NET 세션 상태는 어딘가에 저장되어야 하고, 그 저장 공간은 애플리케이션 데이터베이스처럼 병목 현상이 됩니다. Microsoft는 InProc, State Server 및 SQL Server의 세 가지 스토리지 옵션을 제공합니다. 세 가지 모두 성능 병목 현상이 있습니다.
InProc은 다중 작업자 프로세스가 선호되는 다중 프로세서 또는 다중 코어 환경에서 작동하지 않는 웹 서버당 단일 작업자 프로세스를 사용하도록 합니다.
그리고 로드 밸런싱된 웹 팜에서는 다른 웹 서버가 유휴 상태일 때 이 웹 서버에 과부하가 걸리더라도 항상 사용자 요청을 웹 서버로 보내고 세션을 생성하기 위해 로드 밸런서에 고정 세션 비트가 필요합니다.
또한 SQL Server는 ASP.NET 세션 상태를 BLOB로 저장하기 때문에 이상적인 저장소가 아니며 SQL Server는 이 저장소와 잘 작동하지 않습니다.
NCache 세부 정보 ASP.NET 세션 캐싱 ASP.NET 세션 캐싱 문서
ASP.NET View State 병목
ASP.NET View State 버튼 및 드롭다운과 같은 컨트롤의 데이터를 유지하기 위해 웹 서버에 구성된 클라이언트 측 상태 관리 기능입니다. 이 데이터는 포스트백이 발생할 때만 반환하기 위해 브라우저로 전송됩니다. 그리고 ASP.NET View State 문자열의 크기는 쉽게 수백 KB가 될 수 있으며 매일 받는 수백만 건의 요청으로 곱할 수 있습니다.
이렇게 하면 ASP.NET 응용 프로그램의 응답 시간이 느려질 뿐만 아니라 추가 대역폭이 많이 소모되어 운영 비용이 크게 증가할 수 있습니다.
불필요한 페이지 실행
기본 데이터가 변경되지 않았기 때문에 여러 요청에서 ASP.NET 페이지 출력이 변경되지 않는 경우가 많습니다. 그러나 페이지는 여전히 마지막으로 동일한 출력을 생성하기 위해 실행됩니다. 이 추가 페이지 실행은 메모리와 CPU를 포함한 많은 시스템 리소스를 소비하고 데이터베이스 호출도 합니다.
솔루션: 인메모리 분산 캐시
이러한 모든 문제에 대한 가장 적절한 솔루션은 ASP.NET에 In-Memory Distributed Cache를 통합하고 ASP.Net Core 응용 프로그램. NCache .NET용으로 널리 사용되는 오픈 소스 분산 캐시입니다. XNUMX가지 성능 병목 현상을 해결하는 방법에 대해 빠르게 논의해 보겠습니다. NCache.
NCache 세부 정보 ASP.NET Core 세션 저장 전략 ASP.NET View State 캐싱 속성 및 개요
애플리케이션 데이터 캐싱
NCache 애플리케이션 데이터(읽기 전용 참조 데이터와 자주 변경되는 트랜잭션 데이터 모두)를 캐시하여 값비싼 데이터베이스 이동을 줄일 수 있습니다. 데이터베이스로 이동하는 대신, NCache 요청의 85-90%를 캐시로 라우팅합니다. 이렇게 하면 데이터베이스 경합 가능성이 배제됩니다.
데이터베이스와 달리 NCache 이기 때문에 결코 병목 현상이 되지 않습니다. 분산 캐시 와 선형으로 확장. NCache 캐시 서버 클러스터를 구축하고 트랜잭션 로드가 증가함에 따라 클러스터에 더 많은 서버를 추가할 수 있습니다. 다음은 데이터베이스에서 데이터를 가져와 캐시 클러스터에 저장하는 샘플 코드입니다(아직 캐시에 없는 경우).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Customer Load(string customerId) { // Key format: Customer:PK:1000 string key = "Customers:CustomerID:" + customerId; Customer cust = (Customer) _cache[key]; if (cust == null) { // Item not in cache so load from db LoadCustomerFromDb(cust); // Add item to cache for future reference _cache.Insert(key, cust); } return cust; } |
세션 상태 저장소 구성
NCache 또한 캐시에 ASP.NET 세션을 저장할 수 있습니다. 이것은 다른 스토리지 옵션보다 훨씬 빠른 인메모리 스토어입니다. 신뢰성을 제공하기 위해, NCache 여러 서버에서 세션을 복제합니다. 따라서 서버가 충돌하더라도 세션 데이터는 손실되지 않습니다. NCache 프로그래밍 작업이 필요하지 않으며 web.config 변경을 통해 원활하게 연결할 수 있습니다. 아래는 예시입니다.
1 2 3 4 5 6 7 8 9 |
<configuration> ... <sessionState cookieless="false" regenerateExpiredSessionId="true" mode="Custom" customProvider="NCacheSessionProvider" timeout="20"> <providers> <add name="NCacheSessionProvider" |
상태 구성 보기
NCache 캐시할 수 있습니다. ASP.NET View State 브라우저에 식별자 키만 전송하여 웹 서버 측에서 포스트백으로 돌아오면서, NCache HTTP 처리기를 통해 식별자 키를 가로채서 보기 결과를 가져옵니다. 그러면 이 보기 상태가 ASP.NET 페이지로 전송됩니다.
최종 결과는 대역폭 사용량이 훨씬 적은 훨씬 더 빠른 ASP.NET 응용 프로그램입니다. 다음은 사용 방법에 대한 구성 변경 예입니다. NCache 캐싱을 위해 ASP.NET View State:
ASP.NET 출력 캐시
출력이 변경되지 않을 때 ASP.NET 페이지의 불필요한 실행을 방지하기 위해 ASP.NET은 다음을 제공합니다. 출력 캐시 단일 서버 및 단일 작업자 프로세스 구성을 위한 프레임워크. NCache, 반면에 다중 서버 및 다중 작업자 프로세스 구성을 위해 확장합니다.
을 통하여 NCache, 관련 데이터가 데이터베이스에서 수정되면 페이지가 만료될 수도 있습니다. 아래는 예시입니다.
결론
즉, NCache an 메모리 내 분산 캐시 선형 확장성, 간단한 보기 상태 구성 및 애플리케이션과의 원활한 구성은 이러한 모든 성능 병목 현상에 대한 최상의 솔루션입니다. 이러한 기능은 최적화 성능 .Net 애플리케이션을 더 빠르고 안정적이며 고가용성으로 만들 수 있습니다.