pile·
백엔드·포스타입포스타입·

포스타입이 개인화 추천을 하는 방법 2부

포스타입 백엔드 엔지니어가 벡터 기반 개인화 추천 시스템을 실제 운영하며 맞닥뜨린 성능 장애와 용량 문제를 해결한 과정을 담은 2부다. 수백만 개의 벡터 KNN 검색이 피크 시간대에 전체 Elasticsearch 검색 성능을 흔드는 문제부터 클러스터 OOM 사태까지, 쿼리 최적화와 인프라 분리 두 가지 경로로 근본 해결에 이른다.

핵심 포인트
  • KNN 쿼리의 graph-first(HNSW) 방식 전환으로 피크 타임 검색 스레드 자원 독점 문제 해결
  • fetch 단계에서 post ID와 유사도 점수만 추출해 stored field 전체 읽기 제거, 디스크 I/O·압축 해제 비용 절감
  • `cancel_after_time_interval` 도입으로 타임아웃 시 실제 스레드 해제 보장
  • 샤드 수를 노드 수의 배수로 재조정 후 reindex → 가장 부하가 집중된 노드에서 지연 81% 개선 (32.2ms→6.06ms)
  • KNN 인덱스를 별도 전용 클러스터로 분리해 추천 장애가 검색 전체로 전파되는 문제 차단
  • Matryoshka Representation Learning(MRL) 특성 활용해 벡터 차원 1024→512 축소, 그래프 메모리 78%→34%, 저장 용량 44% 절감
상세 정리
  • 배경: 벡터 KNN 검색 도입 후 피크 시간대에 전체 검색 성능 저하 발생
  • 문제 1: KNN 쿼리가 검색 스레드 자원을 독점 → graph-first(HNSW 그래프 우선 탐색) 방식 전환으로 해결
  • 문제 2: fetch 단계에서 stored field 전체 읽기로 과도한 디스크 I/O 발생 → post ID+유사도 점수만 추출하도록 변경
  • 문제 3: 타임아웃 설정만으로는 스레드 자원이 실제로 해제되지 않음 → `cancel_after_time_interval` 도입
  • 문제 4: 샤드 분배 불균형으로 특정 노드에 부하 집중 → 샤드 수를 노드 배수로 재조정 후 reindex → 81% 지연 개선
  • 문제 5: KNN 추천 클러스터 장애가 일반 검색 전체로 전파 → KNN 인덱스를 전용 별도 클러스터로 분리
  • OOM 사고 후 벡터 차원 축소 검토: MRL(Matryoshka Representation Learning)이 차원 축소 후 정밀도 유지 특성 활용
  • MRL 결과: 벡터 1024→512차원, 그래프 메모리 노드당 78%→34%, 저장 용량 44% 감소
  • 최종 구조: 일반 검색 클러스터와 KNN 전용 클러스터 분리, 쿼리 최적화+인프라 분리의 이중 접근
왜 읽나수백만 개 규모의 벡터 검색을 Elasticsearch 위에서 운영하며 실제로 겪은 성능 병목과 해결 과정을 단계별로 공개한다. HNSW graph-first·MRL 차원 축소·샤드 재조정 등 현장에서 검증된 최적화 기법을 구체적 수치와 함께 확인할 수 있다.
포스타입
포스타입 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 백엔드·twilio-engTwilio Engineering·

    Programmable Messaging에서 Verify API로 마이그레이션하기

    Twilio의 Programmable Messaging API로 자체 OTP 솔루션을 운영하던 서비스가 Verify API로 전환하는 방법을 코드 예시와 함께 설명한다. Verify는 OTP 전송·검증을 위한 전용 API로, 전화번호 구매, 토큰 생성, DB 저장·만료 관리를 내부에서 처리해 개발자가 직접 구현할 코드를 크게 줄인다.

    요약 이어보기
    #authentication#twilio#sms+2
  2. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 1부

    포스타입이 태그 기반 추천의 한계를 극복하고 벡터 임베딩 기반 개인화 추천 시스템을 구축한 과정을 담은 1부다. 유사한 콘텐츠가 다른 용어를 쓰거나 동일한 태그가 전혀 다른 톤의 콘텐츠를 가리키는 문제를 임베딩 벡터로 해결하고, OpenSearch의 HNSW ANN 검색으로 수백만 벡터를 실시간 검색하는 시스템을 구축해 구매율 15% 향상을 달성했다.

    요약 이어보기
    #opensearch#vector-search#recommendation-system+2
  3. 백엔드·여기어때 (GC컴퍼니)여기어때 (GC컴퍼니)·

    실패한 메시지는 어디로 가야 할까?- Kafka Retry/DLT 설계와 운영에서 밟은 3가지 함정

    여기어때 정산개발팀 백엔드 개발자가 Kafka 컨슈머의 실패 처리를 non-blocking 재시도와 공통 DLT(Dead Letter Topic)로 표준화한 공통 라이브러리 구현 과정을 공유한다. 정산 시스템의 각 Kafka 컨슈머가 제각각 다른 방식으로 실패를 처리하던 상황을 @CommonKafkaRetry 어노테이션 하나로 일관되게 표준화하고, 그 과정에서 Spring Kafka의 3가지 숨겨진 함정을 발굴해 해결한 실전 기록이다.

    요약 이어보기
    #kafka#message-queue#spring-kafka+2