큰 파일은 한 번의 요청으로 올리지 않습니다. 파트로 쪼개 각각 올리고 스토리지가 합칩니다. 얻는 것은 둘입니다. 병렬 업로드로 대역폭을 채우고, 재시도 단위가 파일 전체에서 파트 하나로 줄어듭니다.
왜 쪼개야 하나
단일 요청에는 크기 상한이 있습니다. 상한을 넘기면 방법이 없어서 쪼개는 것이 선택이 아니라 필수가 됩니다.
상한 아래여도 쪼개는 이유가 재시도입니다. 50GB 를 올리다 98퍼센트에서 끊기면 처음부터 다시 올립니다. 10MB 파트로 나눴다면 그 파트 하나만 다시 보냅니다.
| 방식 | 실패 시 다시 보낼 양 |
|---|---|
| 단일 요청 50GB | 50GB 전체 |
| 10MB 파트로 나눔 | 10MB |
파트 크기를 정하는 상충
파트를 작게 하면 재시도가 싸지고, 크게 하면 요청 수가 줄어듭니다. 양쪽 다 좋게 할 수는 없습니다.
| 파트 크기 | 좋아지는 것 | 나빠지는 것 |
|---|---|---|
| 작다 | 재시도 비용, 진행률 정밀도 | 요청 수와 왕복 오버헤드가 늘어난다 |
| 크다 | 요청 수가 줄고 처리량이 오른다 | 실패 시 다시 보낼 양이 커진다 |
여기에 제약이 하나 더 붙습니다. 파트 개수에도 상한이 있어서, 파일이 클수록 파트를 작게 둘 수 없습니다. 50GB 를 5MB 파트로 나누면 10,000개가 되는데 상한이 그보다 낮으면 파트를 키워야 합니다. 그래서 파트 크기는 고정값이 아니라 파일 크기에서 계산하는 값입니다.
정리하지 않으면 돈이 나간다
파트를 몇 개 올리다 중단하면 그 파트들이 스토리지에 남습니다. 합치기를 완료하지 않았으니 객체는 없는데 미완성 업로드로 조각이 쌓이고, 조각도 저장 요금을 냅니다.
목록에 안 보이는 것이 함정입니다. 객체 목록을 조회해도 나오지 않아서, 요금이 오르기 전까지 아무도 모릅니다. 그래서 일정 기간 지난 미완성 업로드를 자동으로 지우는 규칙을 처음부터 걸어 둡니다.
병렬은 무조건 이득이 아니다
파트를 동시에 올리면 대역폭을 채울 수 있습니다. 다만 동시 개수를 무한히 늘리면 클라이언트 쪽에서 경합이 생기고 모바일에서는 배터리와 발열이 문제가 됩니다. 동시 개수는 보통 몇 개로 제한하고, 실패한 파트만 다시 큐에 넣습니다.