Spring SimpleBroker의 AntMatcher 성능 병목 해결기
핵심 내용
AntMatcher 패턴 매칭을 제거하고 equals 비교를 적용해 락 경합과 메모리 사용을 개선했다.
자세히 보기
실시간 댓글 서비스의 서버 불안정 문제를 해결하기 위해 Spring SimpleBroker의 내부 동작을 분석하고 최적화한 사례입니다. Threaddump 분석 결과, DefaultSubscriptionRegistry$DestinationCache의 락 경합으로 인해 InboundChannel이 막히는 현상이 확인되었습니다.
문제 원인: AntMatcher의 비효율성
기존 구현은 구독 시 Ant 스타일 패턴 매칭을 사용했습니다. 이로 인해 메시지 발송 시 getSubscriptions() 메소드가 호출될 때마다 캐시 미스 시 전체 세션을 순회하며 패턴을 검사해야 했습니다. 캐시 크기를 늘리면 미스 발생 시 루프 비용이 증가하고, 줄이면 미스 빈도가 높아져 캐시 크기 조정만으로는 해결할 수 없는 구조적 한계가 있었습니다.
해결 방안: 패턴 매칭 제거 및 equals 적용
AntMatcher 로직을 제거하고 destination.equals() 비교 방식으로 변경했습니다. 이를 통해 패턴 매칭으로 인한 오버헤드를 줄이고 메모리 사용량을 감소시켰습니다. 다만, Spring의 기본 구현체인 DefaultSubscriptionRegistry가 상속 확장이 어려워 코드를 복제하여 수정하는 방식으로 적용했습니다.
결과 및 시사점
변경 후 트래픽 폭증 상황(예: 뉴스 속보)에서도 큐 지연이 발생했으나 빠르게 정상화되었습니다. 프레임워크 내부의 동시성 제어 로직이 성능 병목의 원인이 될 수 있음을 보여주며, 필요시 내부 구현을 수정하여 최적화할 수 있음을 시사합니다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.