Preload + On-demand + Fallback 구조란?
이 세 가지는 캐시(다운로드) 전략을 단계적으로 설명하는 개념. 각각 하나하나씩만 사용해도 괜찮다. 필요시 중복으로 도입해서 조립하시라.
도입배경: 프로젝트마다 다르겠지만, mp3를 다운로드 받아 실행하는 프로그램을 만들고 있는데, mp3파일을 구글드라이브에서 다운로드 받는것이 매번 대기시간처럼 불편하게 느껴짐. 단, 캐싱구조 없이 즉지 다운로드 방식으로 먼저 전체 구조를 검토한 뒤에 캐싱전략을 도입할 단계가 되어서 고민하게 됨.
본인은 전체 구조를 완성 한 뒤에 세부구조나 확장을 하는 스타일이라서 그렇게 된 듯.
캐싱구조는 익숙하지가 않아서 보통 나는 위 세가지중 단일 전략만을 주로 사용해왔었는데, 이유는 내가 프로그램을 실행하고 관리하는 주체라서 얼마든지 라이브중에 발생하는 예외들을 처리할 수 있었으므로 초기 개발시간을 단축하려는 목적을 우선시 할 수 있었다.
하지만 현재는 외부에 내 프로그램을 배포하고 관리하기가 어려운 물리적 위치상에 놓이니, 예외상황에 좀 더 신경을 쓰게 되었다.
TMI는 여기까지 하고. 용어부터 생소하니 정리해보았다.
1. 용어 정리
1️⃣ Preload (미리 받아두기, 선로드)
- 프로그램 시작 시 모든 다운로드 대상(ex: mp3) 파일을 미리 백그라운드에서 다운로드 시작하는 전략입니다.
- 프로그램이 시작되기 전이나 진행 중에 미리 준비해두는 것.
- 장점: 이미 다운로드된 파일 → 프로그램 중간에 다운로드 하는 것 보다 대기시간 없이 빠르게 중요한 작업 가능
- 비유: ✈️ "비행 전에 기내식 싣기"
예: 프로그램 시작 후 1~2분 동안 필요한 파일들을 계속 다운로드하는 구조
2️⃣ On-demand (요청 시 즉시 다운로드)
- 재생하려는 '순'간' 해당 파일, 없다면 그때 다운로드 시도하는 전략입니다.
- 장점: 방송은 안 멈춤. 당장 필요한 파일만 받아도 작동
- 비유: ☕ "손님이 커피 주문하면 그때서야 내리는 것"
예: 재생 순번 도달 → mp3 캐시에 없음 → 바로 다운로드 → 재생
3️⃣ Fallback (대체 처리, 예비방식)
- Preload도 안 됐고, On-demand 다운로드도 실패했다면 → 다른 방식으로 처리하는 전략입니다.
- 예: mp3 재생 실패 시 → TTS만 재생하거나 → 건너뛰고 다음 buffer 처리
- 비유: 📻 "라디오 음악파일이 없으면 DJ가 직접 멘트로 넘어가는 것"
✅ 세 가지는 서로 보완관계
전략언제 쓰이는가결과
Preload | 시작 시 전체 다운로드 | 캐시 확보 ↑ |
On-demand | 캐시에 없음 | 즉시 다운로드 |
Fallback | 다운로드도 실패 | 대체 콘텐츠 처리 |
2. 추가로 고려한 사항들
- fail_set 도입: 다운로드 실패한 파일을 추적하여 반복적인 다운로드 시도를 방지함으로써 시스템 부하를 줄이고, 재생 타이밍 충돌을 예방하는 로직
- 즉시 다운로드 시도 수 제한: 각 파일에 대한 다운로드 시도 횟수를 제한하여 시스템 리소스의 과도한 사용을 방지하고, 안정적인 재생 환경을 유지
- Preload 완료 수 기준 프로그램 진행 딜레이(또는 대기): 방송 시작 전에 일정 수의 파일이 다운로드될 때까지 대기함으로써 초기 재생 타이밍 충돌을 방지
두번째꺼는 솔직히 동시에 다운로드하는 파일이 최대 3개도 안될 것 같아 나에게는 해당이 되지 않지만, 걍 넣었다... 번외로 구글 드라이브 API에서는 사용량 제한이 당연히 존재하는데 100초당 2000건의 요청이라고 한다. mp3하나 다운로드 하는 것은 1개의 요청으로 간주됨 .
사용자 계정 또는 프로젝트 별로 제한사항이 존재하니 아래 링크에서 확인해보자
https://developers.google.com/drive/api/guides/limits?hl=ko
사용량 한도 | Google Drive | Google for Developers
가격, 할당량 증가 요청 방법 등 Google Drive 할당량 및 한도에 대해 알아보세요.
developers.google.com
'개발로그 > Python' 카테고리의 다른 글
PyInstaller 로 .exe 만들기 간단 요약 (윈도우 기준), 경로 설정 방법 (0) | 2025.03.23 |
---|---|
anaconda + python 완전히 지우는 방법. (0) | 2025.03.22 |
없어져라! SSL 문제 해결을 위한 실전 대응 북 (0) | 2025.03.16 |
random.choice()와 random.shuffle()은 비슷해 보이지만 목적이 완전히 다르다 (0) | 2025.03.15 |
python - API 연동할 때, 인증코드를 모듈마다 넣는 이유..가 있었다.. 무식해서 그런게 아니라규..ㅠ (0) | 2025.03.11 |
구글드라이브에서 API로 파일 탐색을 할 때, 어떻게 하는게 더 효율적일까? feat ChatGPT (0) | 2025.03.11 |
Pygame에서 나오는 모든 소리를 하나의 파일(wav)로 저장하는 방법 (0) | 2025.03.10 |
threading.Event() 객체의 활용 예제 및 백그라운드 실행 정리 (0) | 2025.03.09 |
댓글