개발자로서 어느 시점에서 클라이언트와 서버 간의 통신을 가속화하는 데 어려움을 겪었을 것입니다. 네트워크 오버헤드, 지연 및 대기 시간은 항상 주요 관심사였으며 이 모든 것은 하나의 단일 질문으로 귀결됩니다. 요청 속도를 어떻게 높일 수 있습니까? 시간이 지남에 따라 수많은 솔루션이 발견되었지만 여기서 우리가 집중하고 있는 대답은 압축 및 압축 직렬화입니다. 당신에게 행운을, NCache 효율적인 압축 및 동적 압축 직렬화 기술을 제공합니다(참고로 둘 다 다른 것입니다). 이 블로그에서는 두 가지 모두의 필요성과 사용 방법을 살펴보겠습니다.
| 제품 특장점 | 최적화 없이 | 와 NCache 최적화 | 소스/로직 |
|---|---|---|---|
| 객체 크기 | 표준 직렬화 | 최대 10배 더 작음 | "데이터 크기 압축" 섹션에 명시적으로 기재되어 있습니다. |
| 네트워크 지연 | 높은 머리 위 | 더 빠른 네트워크 연결 | 바이너리 페이로드 크기가 작아진 직접적인 결과입니다. |
| 메모리 공간 | 압축되지 않은 크기 | GZip 및 컴팩트함을 통해 용량이 줄어듭니다. | 압축 벤치마크 그래프를 통해 확인되었습니다. |
| 코드 작업 | 표준 구현 | 코드 변경 필요 없음 | 두 기능 모두의 주요 이점으로 언급되었습니다. |
주요 요점
데이터 10배 감소: 컴팩트 직렬화는 불필요한 메타데이터를 제거하여 네이티브 직렬화에 비해 객체 크기를 최대 10배까지 줄여 네트워크 오버헤드를 대폭 감소시킵니다.
코드 변경 없음: 대부분의 최적화 효과는 다음을 통해 달성됩니다. NCache 웹 관리자 또는 config.ncconf 개발자가 애플리케이션 로직을 다시 작성할 필요 없이.
이중 레이어 최적화: NCache 직렬화(네트워크 속도)와 압축(메모리 절약)을 I/O 병목 현상을 제거하기 위한 별개의 상호 보완적인 기술로 취급합니다.
임계값 기반 압축: GZip을 사용하여 NCache 특정 크기 임계값을 초과하는 데이터만 압축하여 메모리/네트워크 절약 효과가 클 때만 CPU 사이클이 사용되도록 합니다.
선택적 제어: 복합 유형의 경우, ICompact 직렬화 가능 이 인터페이스는 세부적인 제어 기능을 제공하여 개발자가 네트워크를 통해 전송될 속성을 정확하게 선택할 수 있도록 합니다.
동적 컴팩트 직렬화
NCache 기본 .NET 직렬화 형식에 대한 지원을 제공하지만 다음과 같은 자체 직렬화 프레임워크도 제공합니다. 컴팩트 직렬화. 압축 직렬화도 이진 직렬화이지만 NCache 이 직렬화 프레임워크에 훨씬 더 많은 유연성을 제공합니다. 압축 직렬화는 전체 데이터의 크기를 줄이는 것이 아니라 네트워크를 통해 이동하는 데이터의 크기만 줄입니다. 네트워크 트립이 더 빨라지고 비용이 감소하므로 더 나은 기능을 달성하는 데 도움이 됩니다.
이제 동적 압축 직렬화의 이점과 기본 .NET 직렬화보다 더 유연한 방법을 살펴보겠습니다.
컴팩트 데이터 크기
In NCache, 이진 직렬화 데이터는 크기가 작습니다. 직렬화될 때 이러한 개체는 때때로 실제 데이터 크기보다 XNUMX배 작아집니다. 크기가 작을수록 데이터가 네트워크를 통해 더 빨리 이동하므로 성능이 증폭됩니다. 게다가 데이터가 더 작을수록 캐시 서버에서 더 적은 공간을 차지하므로 메모리 효율성도 높아집니다.
코드 변경이 필요하지 않습니다
데이터를 간결하게 직렬화하기 위해 코드를 변경할 필요가 없습니다. 관리 도구(NCache 웹 관리자 또는 NCache PowerShell 도구). NCache 내부적으로 데이터의 모든 직렬화를 처리하므로 코드를 변경할 필요가 없습니다.
선택적 직렬화
선택적 직렬화는 사용자가 직렬화해야 하는 데이터와 비직렬화로 표시해야 하는 데이터를 모두 제어할 수 있음을 의미합니다. 클래스 내에서 직렬화할 특성을 선택할 수 있습니다. 예를 들어 데이터베이스 연결 개체를 직렬화되지 않은 상태로 유지하려는 경우를 가정해 보겠습니다. 다른 속성을 직렬화하고 원하는 데이터를 직렬화하지 않은 상태로 유지할 수 있습니다.
직렬화할 데이터를 세밀하게 제어하기 위해 ICompactSerializable 인터페이스가 구현됩니다. 이것은 데이터 및 선택적 직렬화에 대한 주요 제어를 제공합니다. 사용자 정의 클래스에는 다음에 의해 호출되는 직렬화/역직렬화 메서드가 필요합니다. NCache 개체를 직렬화/역직렬화합니다. ICompactSerializable 인터페이스가 구현되는 방법을 보려면 아래 코드 예제를 살펴보십시오.
|
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 |
public class Customers : ICompactSerializable { private string _name; private int _id; private string _company; public Customers() { } public Customers(string customerName, int customerID, string companyName) { _name = customerName; _id = customerID; _company = companyName; } #region ICompactSerializable Members public void Deserialize(CompactReader reader) { _name = reader.ReadObject() as string; _id = reader.ReadInt32(); _company = reader.ReadObject() as string; } public void Serialize(CompactWriter writer){ writer.WriteObject(_name); writer.Write(_id); writer.Write(_company); } #endregion } |
NCache 또한 압축 직렬화를 위해 일반 클래스를 등록할 수 있습니다. 제네릭 클래스를 등록하는 방법에는 두 가지가 있습니다. NCache 웹 관리자 또는 IGenericTypeProvider 인터페이스를 통해.
1 단계 : 을 통하여 NCache 웹 관리자
다음을 사용하여 제네릭 클래스를 등록할 수 있습니다. NCache 아래와 같이 웹 관리자:

그림 1: Manager를 사용한 압축 직렬화
2단계: IGenericTypeProvider를 통해
이를 구현하려면 사용자가 GetGenericTypes 메서드를 구현하고 원하는 제네릭 형식을 배열로 반환해야 합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class CustomerPurchaseDetails<T, K, V> { // implement logic } public class CustomerPurchaseImpl : IGenericTypeProvider { Type[] types = new Type[6]; Type[] IGenericTypeProvider.GetGenericTypes() { types[0] = typeof(Dictionary<string, Customer>); types[1] = typeof(List); types[2] = typeof(CustomerPurchaseDetails<Order, Product, Customer>); types[3] = typeof(CustomerPurchaseDetails<Order, Product, int>); types[4] = typeof(CustomerPurchaseDetails<Order, string, byte>); types[5] = typeof(CustomerPurchaseDetails<string, Customer, bool>); return types; } public bool CheckIfSerializable(Type type, FieldInfo fieldInfo) { // implement logic } } |
그런 다음 이 클래스 어셈블리를 다음 위치에 배포합니다. NCache 웹 관리자. NCache Web Manager는 Type 배열에 채워진 모든 유형을 등록합니다.
압축 직렬화 문서 제네릭 클래스 등록 비제네릭 클래스 등록
압축
제공하는 또 다른 효과적인 기술 NCache is 데이터 압축 여기서 압축된 형식의 데이터가 캐시에 추가됩니다. 가장 큰 장점은 압축된 데이터가 압축되지 않은 데이터보다 적은 공간을 차지하고 많은 메모리를 절약한다는 것입니다. 읽기/쓰기 작업의 네트워크 비용을 줄입니다. 따라서 단순히 압축을 사용하여 네트워크 비용, 시간 및 메모리를 효율적으로 절약할 수 있습니다.
NCache GZip 압축을 사용하여 데이터를 압축합니다. 특정 임계값을 결정하고 활성화된 압축의 경우 임계값을 초과하는 모든 항목이 압축됩니다. 압축 및 비압축 데이터와 각각의 메모리 사용량을 비교하였다. 아래 그래프에서 결과를 볼 수 있습니다. 파란색 선은 압축된 데이터의 메모리 사용량을 나타내고 주황색 선은 압축되지 않은 데이터의 캐시 크기를 나타냅니다.

그림 2 : NCache 데이터 압축 여부에 따른 메모리 사용량을 비교하는 벤치마크입니다.
압축은 일반적으로 클라이언트 측과 서버 측에서 압축이 활성화된 경우 발생합니다. 두 서버와 클라이언트 측.
- 클라이언트 측 압축 클라이언트가 서버에서 요청한 모든 항목에 적용됩니다. 서버는 데이터를 압축하여 클라이언트로 보내고 클라이언트는 압축된 데이터를 수신하면 압축을 풉니다. 마찬가지로 클라이언트가 원격 서버로 전송하는 임계값을 초과하는 항목의 경우 데이터가 압축된 형태로 전송됩니다.
- 서버 측 압축 임계값을 초과하는 모든 항목에 대해 발생하며 캐시 시작 로더와 같은 서버 측 기능에 의해 데이터 소스에서 로드됩니다. 이러한 항목은 다음에서 압축됩니다. NCache 데이터 원본에서 받은 후 서버.
압축을 사용하려면 압축을 활성화하기만 하면 되며 이를 위한 두 가지 효과적인 방법이 있습니다.
방법 1: NCahe 웹 관리자 사용
아래 gif는 다음을 사용하여 압축을 활성화하는 방법을 보여줍니다. NCache 웹 관리자:

그림 3: 다음을 사용하여 압축 활성화 NCache 웹 관리자
방법 2: 구성 사용
에 설치된 구성 파일 NCache 이름이 지정된 설치 디렉토리 config.ncconf 압축을 활성화 및 비활성화하는 태그를 포함합니다. 방법을 알려드리겠습니다.
|
1 |
<compression enabled="true" threshold="500kb"/> |
enabled 태그는 압축을 활성화하려면 true로 설정하고 압축을 비활성화하려면 false로 설정합니다. 또한 임계값 태그를 제공하며 제공된 값 이상의 데이터만 압축됩니다.
맺음말
결론적으로 압축 및 압축 직렬화는 응용 프로그램의 성능을 향상시키는 데 매우 효과적인 기술입니다. 다음을 사용하여 이러한 기능을 활성화하는 것도 매우 쉽습니다. NCache 관리 도구. NCache 코드 변경 없이 이 모든 것을 달성할 수 있습니다. 참조하십시오 NCache 다른 멋진 것을 확인하기 위한 문서 NCache 기능을 제공합니다.
자주 묻는 질문 (FAQ)
Q: 컴팩트 직렬화와 압축의 차이점은 무엇인가요? NCache?
A: 컴팩트 직렬화는 객체의 메타데이터 크기를 줄여 네트워크 전송 속도를 높이는 바이너리 프레임워크인 반면, 압축은 GZip을 사용하여 실제 데이터 페이로드의 크기를 줄여 물리적 메모리와 대역폭을 절약합니다.
질문: 컴팩트 직렬화를 사용하려면 기존 클래스 로직을 수정해야 합니까?
A: 아니요. 표준 데이터 유형의 경우, 다음을 통해 등록할 수 있습니다. NCache 코드 변경 없이 웹 관리자 또는 PowerShell 도구를 사용합니다. 수동 구현 ICompact 직렬화 가능 인터페이스는 특정 속성에 대해 세밀하고 선택적인 제어가 필요한 경우에만 필요합니다.
Q : 어떻게합니까? NCache 어떤 항목을 압축해야 하는지 결정해야 합니다.
A: NCache "임계값" 설정(예: 100KB 또는 500KB)을 사용합니다. 이 특정 크기를 초과하는 항목만 압축되므로 시스템이 이점이 미미한 매우 작은 객체에 CPU 리소스를 낭비하지 않습니다.
질문: 압축 및 감압 과정은 실제로 어디에서 이루어지나요?
A: 클라이언트 측과 서버 측 모두에서 발생합니다. 클라이언트가 대용량 데이터를 전송할 때, 네트워크에 도달하기 전에 데이터가 압축됩니다. 마찬가지로, 서버가 소스(예: 데이터베이스)에서 데이터를 로드할 때, 클러스터에 저장하기 전에 데이터를 압축합니다.
질문: 최적화를 위해 제네릭 클래스를 어떻게 등록할 수 있나요?
A: 제네릭 클래스는 두 가지 방법으로 등록할 수 있습니다. NCache 웹 관리자 UI를 구현하거나 다음과 같이 구현하십시오. IGenericTypeProvider 코드에서 필요한 유형의 배열을 반환하는 인터페이스를 구현하세요.





