여러 소스 통합 검색의 리랭킹 부하를 워커 풀로 분산해보자
DB 3개를 federation해 검색하니 DB당 넉넉히 가져온 후보가 배로 불어나 리랭킹이 느려졌다. 전체 리랭킹 풀을 DB 수로 나눠 배분했더니 속도가 3분의 1로 줄었는데 품질은 그대로였다
여러 소스 통합 검색의 리랭킹 부하를 워커 풀로 분산해보자
여러 소스 통합 검색의 리랭킹 부하를 워커 풀로 분산해보자
검색 소스(DB)가 늘어나자 각 DB에서 넉넉하게 후보를 가져와 전부 재정렬(rerank)하는 방식이 후보 수를 DB 개수만큼 불려 느려졌다. 전체 리랭킹 풀을 DB 수로 나눠 배분하는 방식으로 바꿨다.
1. 서론 (Introduction)
- 문제/상황 (Problem): DB 하나일 때 잘 동작하던 “넉넉히 가져와서 리랭킹” 방식이, 소스가 여러 개로 늘자 DB 수만큼 후보가 곱해져 리랭킹 시간이 그대로 늘었다.
- 목적 (Purpose): 전체 리랭킹 풀 크기를 고정하고, 그 풀을 DB 수만큼 나눠 배분해 후보 총량을 일정하게 유지한다.
- 대상 (Target Audience): 여러 DB를 federation해 검색하면서 리랭킹 지연이 늘어나는 걸 겪은 개발자.
2. 방법 및 과정 (Methods & Process)
배경 조사 및 데이터 (Data Collection): 문서 저장소(28,963건)·코드 저장소(3,527건)·이슈트래커(146건) 3개 DB를 federation한 상태에서, 분배 전(DB당 고정 60개, 총 후보 180개)과 분배 후(DB당 20개, 총 후보 60개)를 비교했다.
방식 DB당 후보 총 후보 소요 시간 정확도(문서/코드/이슈) 분배 전 60개 180개 3.60초 77 / 83 / 100 분배 후 20개 60개 1.20초 77 / 83 / 100 - 접근 방법 (Approach Methods):
- [방법 1]: 전체 리랭킹 풀(
RERANK_POOL)을 DB 개수(n_dbs)로 나눠 DB당 몫을 계산한다. DB가 늘어도 리랭킹 대상 총량은RERANK_POOL근처로 유지된다. - [방법 2]: DB당 몫이 너무 적어지는 걸 막기 위해
k + offset(원하는 순위까지 페이지네이션하는 데 필요한 최소량)을 하한으로 보장한다. 나눈 몫이 이보다 작으면 하한값을 쓴다.
- [방법 1]: 전체 리랭킹 풀(
- 분석 및 해결 프로세스 (Analysis Flow):
- 도구/기술: Python, 3개 federation DB(목 데이터로 지연시간 흉내),
distribute_pool()함수. - 주요 단계:
RERANK_POOL // n_dbs로 1차 배분량 계산 $\rightarrow$k + offset과 비교해 하한 보장 $\rightarrow$ DB별로 배분량만큼만 후보 조회 $\rightarrow$ 합친 후보를 리랭킹. - 결과 도출 및 검증: 분배 전 총 후보 180개 기준 3.60초 걸리던 리랭킹이, 분배 후 총 후보 60개로 줄면서 1.20초로 줄었다. 이때 정확도는 77/83/100으로 분배 전후 동일했다 — 후보를 줄였는데도 품질 손실이 없었다.
- 도구/기술: Python, 3개 federation DB(목 데이터로 지연시간 흉내),
3. 결과 (Results)
- 분석 결과 요약: 총 후보 수를 180개에서 60개로 3분의 1로 줄이자 리랭킹 소요 시간도 3.60초에서 1.20초로 3분의 1로 줄었다. 정확도는 세 소스 모두 분배 전후 동일했다(77/83/100). “후보를 더 많이 줄수록 안전하다”는 직관과 달리, 애초에 상위 k개 안에 정답이 들어올 만한 DB는 적은 후보로도 충분했다.
4. 인사이트 및 액션 (Insights & Action)
- 인사이트 (Insight): DB마다 고정된 넉넉한 후보 수를 주는 방식은 federation 규모가 커질수록 리랭킹 비용을 DB 수에 비례해 늘린다. 반면 전체 풀을 고정하고 나눠 배분하면 DB가 늘어도 리랭킹 총량은 거의 그대로다 — 이 트레이드오프를 실제로 후보를 줄여보기 전까지는 품질이 떨어질까 봐 넉넉한 쪽을 계속 썼었다.
- 실행 방안 (Action Plan): federation 대상 DB를 추가할 때는 DB당 고정 후보 수를 늘리는 대신
distribute_pool()같은 배분 함수로 총량을 먼저 정하고 나누는 방식을 기본으로 삼는다. - 한 줄 결론 (Key Takeaway): 리랭킹 풀을 DB 수로 나눠 배분하면 후보 총량은 3분의 1로 줄어도 정확도는 그대로 유지된다. 샘플 코드
- 다음 스텝 (Next Step): 지금은 DB마다 균등하게 나눈다. DB별로 정답이 나올 확률이 다르다면(어떤 DB는 항상 상위권에 정답이 있고 어떤 DB는 드물게 있다면) 균등 배분 대신 DB별 과거 적중률에 따라 가중 배분하는 방향이 남은 과제다.
This post is licensed under CC BY 4.0 by the author.