Составная загрузка
В хранилище нет никаких ограничений по объему объектов. Вы можете загружать объекты любого размера. Однако во время загрузки больших объектов с большой вероятностью могут возникнуть ошибки сети. Из-за ошибок загрузка прерывается, и ее приходится начинать заново. Избежать таких проблем можно с помощью составной загрузки, в ходе которой объект загружается не целиком, а по частям.
Вы можете загружать части независимо друг от друга, в любом порядке. Если при загрузке одной из частей произойдет ошибка, вы сможете загрузить ее повторно, и это никак не повлияет на все остальные части. По окончании загрузки все части объединяются в объект.
Преимущества составной загрузки:
- вы можете загружать части параллельно, что помогает улучшить пропускную способность сети;
- если загрузка оборвалась из-за ошибки сети, повторная загрузка занимает меньше времени по сравнению с загрузкой большого объекта;
- вы можете приостановить загрузку на любой период времени, а затем возобновить ее;
- вы можете начинать загрузку до того, как объект был полностью создан.
Порядок составной загрузки
Составная загрузка включает три этапа:
- инициализация;
- загрузка частей;
- завершение.
Как только приходит запрос на завершение загрузки, на стороне хранилища из частей будет создан объект. Вы можете работать с этим объектом так же, как с любыми другими объектами.
Инициализация загрузки
Когда вы отправляете запрос на инициализацию составной загрузки, API хранилища в ответе вернет идентификатор загрузки. Этот идентификатор нужно будет включать во все запросы на загрузку частей, получение списка частей, завершение и прерывание загрузки.
Если вам нужно добавить к составному объекту метаданные, передайте их в запросе на инициализацию составной загрузки.
Загрузка частей
Каждая часть объекта загружается отдельным запросом. В каждом запросе к части добавляется идентификатор, а также порядковый номер — любое целое число от 1 до 10 000, которое указывает на позицию части в структуре объекта. Части объекта не обязательно нумеровать по порядку: например, вы можете назначить частям номера 1, 3, 5 и 17. Номер должен быть уникальным. Если вы загружаете новую часть с таким же номером, как у предыдущей, предыдущая часть будет удалена.
После каждой части загрузки части хранилище возвращает в ответ заголовок ETag, значение которого используется в качестве идентификатора этой части. По умолчанию значение ETag представляет собой MD5-хеш объекта.
Каждая часть получает собственный ETag при загрузке. Когда загрузка завершена, все части объединяются, а полученный в результате объединения объект получает собственный ETag в виде контрольной суммы контрольных сумм.
Завершение загрузки
Когда все части загружены, они объединяются на стороне хранилища в целостный объект в порядке возрастания номеров. Если в запрос на инициализацию составной загрузки были добавлены метаданные, хранилище присвоит их объекту.
Объект перестает быть суммой частей и рассматривается как единое целое, как только запрос на завершение загрузки успешно выполнен. Запрос на завершение загрузки должен включать идентификатор загрузки, а также список номеров частей и соответствующих им значений заголовка ETag. Ответ на такой запрос будет включать ETag объекта, полученного в результате объединения частей.
Получение списка частей
Когда идет загрузка, вы можете с помощью запроса получить список уже загруженных частей объекта. В ответе на запрос возвращается список не более чем из 1000 частей. Если составная загрузка включает более 1000 частей, то потребуется выполнить несколько запросов, чтобы получить полный список. В список не будут включены части, загрузка которых не завершена.
Получить список незавершенных загрузок можно с помощью запроса list multipart uploads. В ответе на каждый такой запрос возвращается список не более чем из 1000 загрузок. Если незавершенных загрузок больше 1000, то потребуется выполнить несколько запросов, чтобы получить полный список. В список не будут включены части, загрузка которых не завершена.
Внимание
Никогда не используйте список незавершенных загрузок в запросе на завершение составной загрузки. Самостоятельно сохраняйте список номеров частей, а также значения заголовка ETag, которые возвращает API хранилища.
Одновременные операции составной загрузки
В сложных распределенных системах возможны ситуации, когда в хранилище одновременно поступают несколько запросов на изменение одного и того же объекта. Одно и то же приложение может одновременно запустить несколько составных загрузок одного и того же. В рамках каждой из этих загрузок приложение может загружать части, а также отправлять запрос на завершение загрузки и создание нового объекта.
Если в бакете включено версионирование, по завершении каждой загрузки будет включена новая версия. Актуальной версией объекта будет версия, запрос на загрузку которой был отправлен позже всех. Например, если запрос на загрузку одной версии был отправлен в 10 часов 15 минут, а другой версии — в 10.20 минут, то именно вторая версия будет актуальной, даже если первая загрузка завершится позже.
Если в бакете не включено версионирование, то любой запрос, который пришел во время загрузки, будет иметь приоритет. Например, если во время составной загрузки объекта с определенным ключом вы отправите запрос на удаление объекта с таким же ключом, вы можете получить ответ с сообщением об успешном завершении загрузки, даже если вы никогда не увидите этот объект.