파일 업로드 설계는 파일이 어디를 지나가는지로 갈립니다. 앱 서버 디스크에 두는 방식에서 오브젝트 스토리지로, 다시 클라이언트가 스토리지로 직접 올리는 방식으로 올라갑니다. 각 칸이 앞 칸의 특정 결함을 고칩니다.
1번 칸이 왜 깨지나
앱 서버 디스크에 저장하면 세 가지가 동시에 문제가 됩니다.
| 문제 | 언제 드러나나 |
|---|---|
| 용량 | 디스크가 차면 배포가 아니라 장애가 된다 |
| 소실 | 인스턴스를 교체하거나 오토스케일로 줄이면 파일이 사라진다 |
| 서버 상태 | 서버마다 다른 파일을 갖게 되어 무상태가 깨진다. 로드밸런서가 다른 서버로 보내면 파일이 없다 |
마지막이 가장 비쌉니다. 서버를 늘리는 것만으로 해결되지 않는 문제가 되기 때문입니다.
2번 칸이 남기는 것
파일을 오브젝트 스토리지에 두면 용량과 소실과 무상태가 한 번에 풀립니다. 서버는 파일을 들고 있지 않으므로 언제든 교체할 수 있습니다.
그런데 파일이 여전히 앱 서버를 통과합니다. 앱이 받아서 다시 보내므로 대역폭과 메모리를 앱이 내고, 요청 하나가 오래 붙잡히므로 동시 업로드가 늘면 스레드가 먼저 바닥납니다.
요구사항의 숫자가 이 칸의 한계를 보여줍니다. 하루 40TB 가 앱을 통과해야 하고, 최대 50GB 파일 하나가 요청 하나를 아주 오래 붙잡습니다. 파일을 저장하지 않아도 지나가게 하는 것만으로 앱이 병목입니다.
3번 칸으로 올라가는 이유
앱 서버는 권한을 확인하고 서명된 주소만 내려줍니다. 파일은 클라이언트가 스토리지로 직접 보냅니다. 앱 서버가 지나가는 경로에서 빠지므로 파일 크기가 앱의 부담과 무관해집니다.
대신 새 숙제가 생깁니다. 파일이 앱을 거치지 않으니 앱은 업로드가 끝났는지 모릅니다. 검증도 못 하고 메타데이터도 기록하지 못합니다. 이 숙제를 푸는 것이 다음 개념들입니다.
사다리를 오르지 않아도 되는 경우
3번이 항상 정답은 아닙니다. 하루 열 건에 100KB 짜리 설정 파일이라면 1번으로 충분하고, 서명 발급과 완료 통보를 만드는 것이 오히려 손해입니다. 선택을 정하는 것은 기술의 새로움이 아니라 파일 크기와 동시 업로드 수입니다.