컬리 공통 암호화 모듈의 동시성 이슈 해결하기
박준규 · 컬리 · 컬리 기술 블로그
소개
공통 모듈에서 발생한 동시성 이슈의 해결 과정을 소개합니다.
AI 핵심 요약
컬리의 공통 암호화 SDK에서 간헐적으로 `newPosition > limit` 오류가 발생해, 일부 고객의 전화번호가 빈칸으로 표시되는 문제가 생겼습니다. 원인을 추적한 결과 Caffeine 캐시에 저장된 AWS KMS Data Key의 `ByteBuffer`를 여러 스레드가 공유했고, `clear()`와 `get()`이 변경하는 position 상태가 서로 영향을 주는 동시성 문제였습니다. 고정 스레드 풀로 암호화 로직을 병렬 실행하고 버퍼 상태를 출력해 문제를 재현한 뒤, 성능 저하가 우려되는 `synchronized` 대신 `duplicate()`로 스레드별 버퍼를 사용하도록 바꿨습니다. 공유 버퍼는 여러 스레드에서 안전하지 않으므로, 상태를 변경하는 API의 thread-safety를 확인하고 독립된 버퍼를 제공해야 한다는 점을 보여줍니다.
- ByteBuffer의 position과 limit은 버퍼 상태를 나타내며, 상대적 읽기 작업은 position을 변경한다.
- 공유 객체의 메서드가 thread-safe한지 API 문서에서 확인하고, 여러 스레드가 접근할 때는 상태 변경 여부를 점검한다.
- 동시성 문제를 재현할 때는 고정 스레드 풀로 요청을 병렬 실행하고 position·limit 같은 내부 상태를 기록한다.
- 공유 버퍼를 동기화하면 성능 비용이 생길 수 있으므로, duplicate()나 asReadOnlyBuffer()로 스레드별 버퍼를 사용하는 방법을 검토한다.
비슷한 학습 자료
프론트엔드 배포 시스템의 진화 (1) - 결제 SDK에 카나리 배포 적용하기
라웅배 · 토스 기술 블로그
컬리의 입고 시스템이 외부 인입 데이터를 안전하게 동기화하는 방법
이창섭 · 컬리 기술 블로그
딜리버리 암호화 모듈 개발기
강준영 · 컬리 기술 블로그
컬리의 새로운 배송 시스템 구축 과정과 우리가 배운점
한경훈 · 컬리 기술 블로그
컬리 검색이 카프카를 들여다본 이야기 1
서민우 · 컬리 기술 블로그
컬리가 상품을 고객에게 빠르게 전달하는 똑똑한 방법
구병주 · 컬리 기술 블로그