figma3분 읽기

큐레이션 요약

Figma에서의 속도 탐

원문 읽기(새 탭에서 열림)

Figma는 검색 지연의 원인을 OpenSearch 자체의 검색 속도보다 쿼리 전후 처리와 잘못된 모니터링 지표에서 발견했다. OpenSearch가 보고한 평균 8ms는 전체 검색 시간이 아니라 개별 샤드 쿼리 시간에 불과했으며, 실제 애플리케이션 호출은 평균 150ms에 달했다. 조사 결과 권한 필터를 만드는 사전 처리와 검색 결과를 검증하는 사후 처리가 전체 시간의 대부분을 차지했고, 이를 개선하는 것이 확장 가능한 검색 기반을 마련하는 핵심이었다.

OpenSearch 마이그레이션과 검색 성능 문제

  • Figma는 2023년 말까지 오래된 Elasticsearch 버전을 사용하다가 AWS 관리형 OpenSearch로 이전하기 시작했다.
  • OpenSearch는 Elasticsearch의 라이선스 변경 이후 분기된 프로젝트로, 기본적으로 호환되지만 3년간 세부적인 차이가 누적되어 마이그레이션이 예상보다 어려웠다.
  • 사용자와 데이터가 증가하면서 검색 시스템이 원하는 콘텐츠를 안정적으로 찾기 어려워졌고, 장기적인 확장을 위한 검색 인프라 재정비가 필요해졌다.

잘못 해석한 8ms 지표

  • Datadog의 OpenSearch 연동에서는 평균 검색 시간이 약 8ms로 나타났다.
  • 하지만 Figma 검색 API의 p99 지연 시간은 거의 1초였고, 애플리케이션에서 OpenSearch API를 호출하는 데 걸린 시간은 다음과 같았다.
    • 평균 약 150ms
    • p99 약 200~400ms
    • 최소 지연 시간도 40ms 이상
  • OpenSearch와 애플리케이션이 같은 AWS 가용 영역에서 실행되고 있었기 때문에 네트워크 지연만으로는 이 차이를 설명할 수 없었다.
  • 원인은 8ms가 전체 검색 시간이 아니라 각 샤드에서 실행된 개별 쿼리의 평균 시간이었기 때문이다.

OpenSearch의 쿼리 및 fetch 단계

  • 검색 요청은 먼저 coordinator 노드에 전달된다.
  • coordinator 노드는 인덱스의 각 샤드가 있는 worker 노드에 쿼리를 보낸다.
  • 이 과정이 OpenSearch의 query 단계다.
  • coordinator는 각 샤드의 결과를 수집하고 정렬한 뒤, 상위 결과에 대한 상세 정보를 다시 요청한다.
  • 이 후속 과정이 fetch 단계이며, 최종 결과가 클라이언트에 반환된다.
  • Figma의 초기 구성에서는 사용자 검색 하나가 최대 500개의 샤드 쿼리를 발생시킬 수 있었다.
  • 샤드 쿼리 대부분은 병렬 실행되지만 모두 동시에 처리되는 것은 아니므로, 개별 샤드 시간과 전체 검색 시간 사이에 큰 차이가 발생했다.

전체 검색 시간을 측정하도록 계측 개선

  • Figma는 검색 코드의 주요 구간에 메트릭과 트레이스를 추가했다.
  • 조사 결과 OpenSearch가 보고하는 지표와 실제 API 호출 시간 사이에 큰 불일치가 있음을 확인했다.
  • OpenSearch의 기본 메트릭과 로그에는 coordinator 관점의 전체 쿼리 시간이 포함되지 않았다.
  • 전체 검색 시간은 검색 API 응답의 took 필드에만 제공됐다.
  • Figma는 모든 검색 응답에서 took 값을 추출해 모니터링 시스템에 추가했고, 이를 통해 실제 백엔드 검색 지연을 보다 정확하게 파악했다.

병목은 OpenSearch 검색 자체가 아니었다

  • 실제로 OpenSearch에서 검색을 기다리는 시간은 전체 쿼리 API 시간의 30% 미만이었다.
  • 나머지 시간은 검색 전후의 애플리케이션 처리에 사용됐다.
  • 사전 처리
    • 사용자가 접근할 수 있는 파일 관련 정보를 조회한다.
    • 접근 권한이 없는 파일을 대부분 제외하도록 OpenSearch 필터 절을 생성한다.
  • 사후 처리
    • OpenSearch가 반환한 각 파일 결과에 대해 사용자의 실제 접근 권한을 다시 확인한다.
    • 권한 검증을 통해 사용자가 볼 수 없는 파일이 검색 결과에 포함되지 않도록 보장한다.
  • 특히 사후 처리가 매우 느렸으며, Figma는 권한 시스템과 협력해 이 부분을 개선하기 시작했다.

검색 성능을 개선하려면 검색 엔진이 표시하는 단일 지표만 믿지 말고, coordinator부터 애플리케이션의 사전·사후 처리까지 전체 요청 경로를 측정해야 한다. Figma 사례처럼 샤드별 지연 시간보다 실제 사용자 요청의 전체 지연 시간을 기준으로 병목을 찾아야 하며, 권한 필터 생성과 결과 검증도 검색 성능의 핵심 구성 요소로 다뤄야 한다.

큐레이션 요약을 이어서 읽어보세요.