본문으로 이동
컬리 공통 암호화 모듈의 동시성 이슈 해결하기
문서

컬리 공통 암호화 모듈의 동시성 이슈 해결하기

박준규 컬리 · 컬리 기술 블로그

원문 보기

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()로 스레드별 버퍼를 사용하는 방법을 검토한다.

소개

공통 모듈에서 발생한 동시성 이슈의 해결 과정을 소개합니다.

비슷한 학습 자료

문서 라웅배

토스페이먼츠 SDK 팀에서 카나리 배포를 프론트엔드 제품에 적용하면서 개발자들의 배포 경험을 개선한 사례를 소개해요.

프론트엔드 데브옵스 · 인프라

문서 이창섭

아웃박스 패턴과 재시도 토픽으로 외부 채널 입고 정보를 안전하게 동기화하기

백엔드

문서 강준영

딜리버리에서 사용하고있는 암호화모듈을 개발한 경험을 공유합니다.

프로그래밍 언어 보안

문서 한경훈

컬리의 새로운 배송 시스템 구축 과정과 프로젝트에서 얻은 교훈을 소개합니다.

백엔드

문서 서민우

카프카 설정 튜닝만으로 색인 속도를 개선하다

백엔드 데이터베이스

문서 구병주

최적화 기법을 활용한 배송 효율화 사례 소개

딥러닝 · 머신러닝