5

Это может показаться действительно основным вопросом, но если я загружаю файл с S3, когда он обновляется другим процессом, мне нужно беспокоиться о получении неполного файла?загрузка с AWS S3 во время обновления файла

Пример: 200-мегабайтный CSV-файл. Пользователь A начинает обновлять файл с 200 МБ нового контента со скоростью 1 Мбит/с. Через 16 секунд пользователь B начинает загрузку файла со скоростью 200 Мбит/с. Получает ли пользователь B все 200MB исходного файла, или пользователь B получает ~ 2MB изменений пользователя A и ничего больше?

ответ

9

Пользователь B получает все 200 МБ исходного файла.

Вот почему:

PUT операция на S3 является неделимой. Технически нет такой вещи, как «модификация» объекта. Что на самом деле происходит, когда объект перезаписывается, так это то, что объект заменен другим объектом, имеющим тот же ключ. Но исходный объект фактически не заменяется до тех пор, пока новый (перезаписывающий) объект не будет загружен полностью и успешно ... и даже тогда перезаписанный объект технически не «ушел» - он заменен только в индексе ковша , так что будущие запросы будут обслуживать новый объект.

(обслуживающий новый объект фактически документирован, как не гарантировано всегда происходят немедленно. В отличии от добавления новых объектов, которые немедленно доступны для загрузки, перезаписывает существующие объекты являются в конечном счете соответствует, а это означает, что это возможно - как бы маловероятно, - что в течение короткого периода времени после того, как вы загрузите объект, который старая копия еще может быть подана для последующих запросов).

Но когда вы перезаписываете объект, а управление версиями не включено в ведро, старый объект и новые объекты фактически хранятся независимо в S3, несмотря на один и тот же ключ. Старый объект теперь больше не ссылается на индекс ведра, поэтому вам больше не выставлен счет за его хранение, и он вскоре будет удален из хранилища поддержки S3. На самом деле это не документировано, насколько это происходит позже ... но (tl; dr), перезаписывающий объект, который в настоящее время загружается, не должен вызывать каких-либо неожиданных побочных эффектов.

Обновления для одного ключа являются атомарными. Например, если вы нажмете на существующий ключ, последующее чтение может вернуть старые данные или обновленные данные, но никогда не будет записывать поврежденные или частичные данные.

http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel

+0

Не мог бы вы ссылаться на источнике? – PhilT

+2

@PhilT сделано. Если «последующее» чтение может вернуть новый или старый объект, можно сделать вывод о том, что выполняемая загрузка будет продолжать возвращать старый объект. Когда вы «перезаписываете» объект, перезаписывается только индексная запись, которая позволяет переднему концу S3 извлекать объект из хранилища. Новый объект записывается отдельно, индекс обновляется, а затем удаляется старый объект (если только ведение версий ведра не включено, и в этом случае оно также сохраняется). Таким образом, перезаписывание является логичным, а не физическим, а краткие задержки репликации в индексе являются причиной возможной согласованности. –

+0

Отлично! Благодарю. – PhilT

Смежные вопросы