pile·
백엔드·티몬티몬·

섬네일 생성 자동화 - 미션2. 처리속도 높이기

섬네일 생성 자동화 2부로, 1부에서 해시로 중복 요청을 걸러낸 뒤 남은 요청을 어떻게 더 빨리 처리했는지 다룬다. 동기 API 를 포기하고 DB 배치로 바꾼 뒤, 병목 구간만 병렬화해 딜 하나 처리 시간을 22초에서 6초로 줄였다.

핵심 포인트
  • 섬네일 서버는 이미지 장당 약 0.5초가 걸리고 딜 하나에 원본이 42장이라 20초가 넘는다. 하루 1만 딜이면 56시간, 약 2.3일이 든다.
  • 동기 방식으로는 성립하지 않는다고 보고 비동기 후보 세 가지(새 스레드, 메시지 큐, DB 배치)를 비교했다.
  • 새 스레드는 최악의 경우 CPU 점유율이 치솟아 다른 작업을 방해하고 장애 복구가 어려워 제외했다.
  • 메시지 큐는 큐를 메모리에 쌓아 빠르지만, 접근이 드문 섬네일 서비스에는 자원 낭비라 제외하고 DB 배치를 골랐다.
  • 병렬 처리 후 스레드 8개 고정 할당으로 딜당 6초, 기존 22초 대비 약 4배 개선했다.
상세 정리
  • DB 배치를 고른 이유는 구현이 상대적으로 쉽고 하드디스크 기반이라 분석 대상을 사실상 무제한으로 쌓아 둘 수 있어서다.
  • 배치만으로는 부족했다는 점을 분명히 한다. 지금 당장 계산하지 않아도 될 뿐 딜 하나를 처리하는 시간 자체는 그대로였다.
  • 기존 단일 스레드 로직: 이미지 콘텐츠 DB 에서 딜의 이미지 정보를 가져와 JSON 을 파싱해 URL 을 뽑고, 기존 섬네일 정보도 함께 가져와 비교한다.
  • 분기 규칙: URL 이 기존 정보에 있으면 아무것도 하지 않고, 없으면 이미지를 내려받아 해시를 계산한다. 해시가 이미 있으면 URL 만 다른 같은 이미지로 보고 기존 섬네일 정보를 복사해 매칭하며, 없으면 신규 생성을 요청한다.
  • 병목 측정: 샘플 딜 테스트에서 섬네일 서버에 이미지를 보내고 결과를 받는 구간이 전체 연산 시간의 70% 를 차지했다. 2위는 서버에서 이미지를 내려받아 저장하는 시간이었다.
  • 개선 설계의 핵심은 분류와 요청을 분리한 것이다. 기존에는 이미지 분류와 섬네일 요청이 뒤섞여 있었는데, 먼저 플래그로 전부 분류한 뒤 필요한 것만 모아 처리한다.
  • 분류 4가지: ① URL 이 이미 있으면 종료 ② 해시는 있고 섬네일 정보도 있으면 복사해 저장 ③ 해시는 있으나 섬네일 정보가 없으면 참조 URL 과 함께 `LOOKUP_NEED` 표시 ④ 해시도 없으면 `REQUEST_NEED` 표시.
  • 실행 순서: `REQUEST_NEED` 만 필터링해 멀티 스레드로 한 번에 요청·저장하고, 그다음 `LOOKUP_NEED` 항목이 참조 URL 의 섬네일 정보를 복사해 저장한 뒤, 마지막에 DB 를 갱신한다.
  • 스레드 수는 서버를 공유하는 상황에서 너무 많이 할당하면 다른 서비스에 지장을 줄 수 있어 8개로 고정했다.
  • 처리 속도는 스레드 개수에 비례해 향상됐다고 밝히며, 무한정 늘리지 않은 이유를 함께 남긴다.
왜 읽나외부 서버 호출이 병목인 배치 작업을 손봐야 하는 백엔드 개발자에게, 비동기 방식 선택 근거와 "분류 후 병렬 요청" 재구성 패턴을 준다.
티몬
티몬 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (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. 백엔드·포스타입포스타입·

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

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

    요약 이어보기
    #elasticsearch#vector-search#recommendation-system+2
  3. 백엔드·포스타입포스타입·

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

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

    요약 이어보기
    #opensearch#vector-search#recommendation-system+2