피드로 돌아가기
Dev.toBackend
원문 읽기
FrozenDictionary를 Array 기반 O(1) 조회 구조로 개선한 Zero-allocation 설계
I shipped a NuGet package, then rewrote it completely. Here's why.
AI 요약
Context
분산된 마이크로서비스 간 MCC 코드 매핑 데이터 불일치 해결을 위해 공통 라이브러리 구축 필요성 대두. 초기 v1 버전의 FrozenDictionary 구조는 고처리량 트랜잭션 환경에서 잦은 문자열 할당 및 해시 연산으로 인한 성능 병목 발생.
Technical Solution
- MCC 코드가 0-9999 범위의 정수라는 도메인 특성을 활용하여 Fixed-size Array 기반의 인덱스 직접 참조 구조 설계
- ReadOnlySpan 전용 Custom Parser 구현을 통한 String 할당 제거 및 .NET Standard 2.0 호환성 확보
- IMccLookup 인터페이스와 배열 복제 방식을 통한 원본 불변성 유지 및 팀별 Custom Mapping 확장성 제공
- 카테고리별 역방향 조회를 위한 보조 인덱스(Secondary Index) 사전 구축으로 전체 스캔 비용 제거
- int, string, ReadOnlySpan 세 가지 오버로드 제공으로 호출부 데이터 타입에 따른 최적 경로 최적화
실천 포인트
1. 고성능 경로에서 문자열 파싱이 빈번하다면 ReadOnlySpan<char> 기반의 custom parser 검토
2. 입력 값의 범위(Range)가 제한적인 경우 Dictionary 대신 Array 기반의 Lookup Table 적용 고려
3. 라이브러리 설계 시 기본 설정의 불변성(Immutability)을 유지하면서 클론 기반의 확장 인터페이스 제공