fetch 실현하기: 범용 (새 탭에서 열림)
Datadog은 대규모 대시보드의 복잡한 데이터 페칭과 렌더링 성능을 최적화하기 위해 기존의 복잡한 휴리스틱 기반 스케줄러를 단순화하고 범용적인 시스템으로 재설계했습니다. 새로운 스케줄러는 쿼리와 렌더링 로직을 분리하고 가시성 중심의 작업 분배 알고리즘을 도입하여 백엔드 부하를 줄였으며, 최신 브라우저 스케줄링 API를 통해 런타임 성능을 극대화했습니다. 결과적으로 코드의 복잡성은 대폭 낮아졌고, API 호출 오류 감소와 함께 전반적인 사용자 경험이 향상되는 성과를 거두었습니다. ### 기존 스케줄러(v1)의 구조적 한계 * 20개 이상의 복잡한 매개변수와 서로 얽힌 휴리스틱으로 구성되어 있어, 개발자가 시스템의 동작을 예측하거나 유지보수하기 매우 어려웠습니다. * 쿼리(데이터 페칭)와 렌더링 스케줄링이 명확히 분리되지 않아, 렌더링 작업이 지연될 때 연관 없는 쿼리까지 함께 지연되는 비효율이 발생했습니다. * 대시보드 환경에만 특화된 로직으로 작성되어 있어, Datadog 내의 다른 제품이나 일반적인 위젯 컴포넌트에서 재사용하기 어려운 구조였습니다. ### 단순하고 효율적인 쿼리 스케줄링 알고리즘 * 화면에 보이는(Visible) 위젯의 쿼리는 즉시 실행하고, 비가시적 위젯의 쿼리는 큐에 쌓아 순차적으로 처리하는 단순한 방식을 채택했습니다. * 비가시적 쿼리는 2000ms의 고정된 시간 윈도우 내에서 최대 10개까지만 실행하도록 제한하여 백엔드 서비스의 부하를 안정화했습니다. * 브라우저가 자체적으로 처리하는 탭 포커스 여부 확인 등의 불필요한 체크 로직을 제거하여 관리 매개변수를 20개에서 6개로 줄였습니다. * 효율적인 작업 분산을 통해 '429(Too many requests)' 에러 발생률을 낮추었으며, 이는 결과적으로 재시도 횟수를 줄여 데이터 로딩 속도를 개선했습니다. ### Browser Scheduling API를 통한 렌더링 제어 * 브라우저의 CPU 및 메모리 자원 상태를 고려하지 못하던 기존 방식의 한계를 극복하기 위해 네이티브 브라우저 스케줄링 API(`postTask`)를 도입했습니다. * 작업을 중요도에 따라 `user-blocking`(사용자 차단), `user-visible`(사용자 가시), `background`(백그라운드) 세 단계로 분류하여 브라우저가 최적의 시점에 실행하도록 위임했습니다. * 중요도가 낮은 렌더링 작업은 브라우저가 유휴 상태일 때 실행되도록 설정하여 메인 스레드의 병목 현상을 방지하고 부드러운 UI 반응성을 확보했습니다. * `TaskController`를 활용해 특정 그룹의 작업 우선순위를 일괄 변경하거나 불필요한 작업을 즉시 중단(abort)할 수 있는 제어 구조를 갖추었습니다. 애플리케이션의 성능 최적화를 고려한다면 복잡한 자체 규칙을 만들기보다 가시성(Visibility)과 같은 핵심 지표에 집중하고, 최신 브라우저가 제공하는 스케줄링 표준 API를 활용하여 시스템 자원을 효율적으로 관리하는 것이 바람직합니다.