Вторая и третья части сравнения сервисов хранилищ Windows Azure и Amazon. Остаётся последняя часть — сравнение Windows Azure Blob Storage и Google Cloud Storage.
В первой части этой статьи мы начали сравнение Windows Azure Blob Storage and Amazon Simple Storage Service (S3), посмотрели на базовые концепции и сравнили ценообразование и функциональность, касающуюся контейнеров блобов и корзин. Читать первую часть.
В этой части статьи мы сравним функциональность, касающуюся блобов и объектов, и закроем сравнение сервисов хранилищ обеих систем, сведя получившиеся данные в одну общую таблицу.
Первая часть цикла — Сравнение Windows Azure Table Storage и Amazon DynamoDB
Вторая часть цикла — Сравнение Windows Azure Blob Storage и Amazon Simple Storage Service (S3) — ч. I
Аббревиатуры: Windows Azure Blob Storage — WABS и Amazon Simple Storage Service — AS3.
Перед подробным обсуждением функций я считаю важным пояснить некоторые концепции, стоящие за блобами и объектами.
Блобы и объекты: Блобы WABS и объекты AS3 – это файлы в вашей облачной файловой системе, расположенные в контейнерах блобов и корзинах.
Комментарии:
Двумя наиболее важными функциями является загрузка и скачивание, поэтому я предлагаю обсудить сначала их, потом сравнить остальные функции.
Давайте поговорим о загрузке блобов и объектов в контейнеры и корзины. Есть два механизма загрузки – можно загружать блоб или объект полностью в рамках одного запроса или разделить их на куски (блоки или страницы WABS и части в AS3).
Если загружаемые данные имеют небольшой размер и у вас хорошая скорость подключения, вы можете полностью загрузить эти данные в одном запросе. В WABS для этого используется Put Blob. В AS3 — Put Object.
Можно разделять большие данные, которые неэффективно загружать в одном запросе полностью. Обе системы позволяют разбивать данные на куски (блоки или страницы в WABS и части в AS3) и загружать постепенно. В WABS для блочных блобов необходимо использовать PutBlock и Put Block List, для страничных — Put Page. В AS3 для этого используются функции Initiate Multipart Upload, Upload Part и Complete Multipart Upload либо Abort Multipart Upload.
Есть много причин, по которым можно решить загружать данные кусками:
Теперь что касается того, как загрузить данные кусками в каждой из систем. Например, вы хотите загрузить кусками файл размером 100 Мб. Посмотрим, что нужно будет сделать при использовании каждой из платформ.
Допустим, каждый кусок имеет размер в 1 Мб (несмотря на то, что нет необходимости иметь куски одинакового размера) и вам необходимо совершить загрузку 100 кусков. Берем блочный блоб, каждый из блоков (кусков) которого имеет уникальный идентификатор (BlockId). Для его загрузки используем функцию Put Block. BlockId – строка, зашифрованная Base64, максимальный размер которой ограничен 64 байтами. Все BlockId (100 в нашем случае) должны быть одной длины. При этом неважно, в каком порядке вы будете загружать блоки – вы можете загружать их и параллельно. После загрузки блока WABS кладет его куда-то в хранилище, и хранит 7 дней. После загрузки всех блоков вызываем Put Block List, подтверждая (commit) эти блоки. До момента вызова этой функции к блобу обратиться нельзя и, если вы не подтвердили блоки в течение 7 дней, они будут удалены системой. После вызова функции, основываясь на порядке списка BlockId, WABS воссоздаст блоб и пометит его как доступный. Нет разницы, какие значения будут иметь BlockId (все они могут быть GUID), но важно, в каком порядке вы отправите список BlockId при использовании Put Block List.
Ограничения:
Допустим, размер каждого куска – 5 Мб. Каждому куску назначается уникальный идентификатор (Part Number), идентифицирующий кусок и определяющий его позицию в исходном объекте. Этот номер может быть любым номером от 1 до 10000, но они должны быть отсортированы, т.е., если брать нашу ситуацию, то кусок 0-5Мб должен иметь номер 1, кусок 5-10 Мб – 2, и так далее. Но, когда вы начнете загружать эти части, сначала необходимо вызвать функцию Initiate Multipart Upload, которая скажет AS3, что начат процесс передачи объекта по кускам. Функция возвратит Upload Id. Далее для каждого куска надо вызвать функцию Upload Part и передать Upload Id и номер куска, причем неважно, в каком порядке будут загружены куски (можно загружать параллельно). После загрузки всех кусков нужно вызвать функцию Complete Multipart Upload, подтвердив таким образом куски. Для отмены процесса можно вызвать Abort Multipart Upload.
Ограничения:
Для скачивания блобов и объектов существует два механизма – либо скачивание блоба или объекта целиком в одном запросе либо кусками.
В каждой системе есть только одна функция для скачивания — Get Blob в WABS и Get Object в AS3.
Если данные имеют небольшой размер и у вас хорошая скорость подключения, вы можете скачать объект полностью, используя Get Blob в WABS и Get Object в AS3.
Если объект имеет большой размер и вы не уверены, сможете ли скачать его за один раз, вы можете качать кусками, используя ту же функцию с добавлением заголовка Range и определив диапазон байт, необходимый для скачивания.
Процесс скачивания:
Функции, предоставляемые обеими системами, сведены в таблицу ниже.
Обсудим поподробнее эти функции.
Функция добавляет блоб в контейнер блобов и объект в корзину.
Комментарии:
Функция добавляет объект в указанную корзину, используя HTML-форму. POST является альтернативой PUT и позволяет реализовать загрузку объекта с помощью браузера. Параметры, переданные PUT с помощью HTTP-заголовков, передаются в случае POST как тело зашифрованного сообщения multipart/form-data.
Функция позволяет скачать блоб из контейнера или корзины.
Комментарии:
AS3 позволяет использовать объекты с помощью протокола BitTorrent, который также может сократить количество передаваемого траффика. Подробнее про использование BitTorrent и AS3 — здесь.
Функцию можно вызывать только на объектах, имеющих размер менее 5 Гб.
В AS3 можно указать ACL на уровне отдельного объекта (в WABS ACL можно указать только на уровне контейнера блобов). Эта функция используется для получения информации об ACL, указанном для объекта
Интересным моментом является то, что если вы используете разные версии объекта, каждая версия будет иметь отдельный ACL. Для получения ACL конкретной версии объекта необходимо передать функции Version Id версии.
Функция позволяет указать ACL для объекта. Как указывалось выше, каждая версия объекта имеет собственный ACL. Для указания ACL для конкретной версии объекта функции необходимо передать Version Id этой версии.
Функция используется для получения свойств блоба и метаданных объекта, но не возвращает содержимое блоба.
Комментарии:
Функция определяет системные свойства блоба в WABS. Недоступна в AS3. При создании объекта можно указать только системные свойства.
Свойства, доступные для определения, включают в себя: Cache Control, Content Type, Content MD5, Content Encoding, Content Language. Обратите внимание, что вы не имеете права переопределять эти свойства для снапшота блоба.
WABS позволяет определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match).
Функция возвращает определенные пользователем метаданные. Эту функцию можно использовать для получения свойств конкретной версии блоба или объекта. Для получения этой информации необходимо указать дату/время снапшота блоба в WABS и Version Id необходимой версии в AS3. Если эти параметры опущены, возвращается информация о текущей версии.
Функция используется для указания словаря метаданных в виде коллекции записей ключ-значение для блобов в WABS.
Комментарии:
Функция удаляет блоб или объект из хранилища.
Комментарии:
· WABS позволяет определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match).
Эта функция позволяет удалить в одном HTTP-запросе несколько объектов из корзины – для этого необходимо знать ключи удаляемых объектов. Можно удалять также конкретные версии одного или нескольких объектов. В одном запросе можно удалить до 1000 объектов.
Функция копирует блоб куда-либо из исходного расположения.
Комментарии:
· Обе системы позволяют определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match). Эти условия можно определить как на исходнике, так и на конечной копии в WABS и на исходнике в AS3.
· WABS позволяет копировать объекты из контейнера в контейнер только в пределах одного аккаунта хранилища. В AS3 подобного ограничения нет. Если корзины, между которыми происходит обмен, принадлежат к одному аккаунту, объект будет скопирован. Однако, если вы создали объект, используя API для загрузки кусками, вы не сможете копировать объект из региона в регион.
· Обе системы позволяют вам скопировать существующие метаданные или указать метаданные для конечной копии.
· AS3 реализует эту функцию как комбинацию GET Object и PUT Object.
Полезные советы:
Функция создает read-only копию блоба – так реализуется версионирование WABS. Как я упоминал в предыдущих статьях, AS3 самостоятельно реализует версионирование. В WABS же версионирование реализовано на уровне конкретного блоба и версионирование этого блоба переходит в ответственность разработчика.
Комментарии:
· WABS позволяет определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match).
Функция позволяет поставить одноминутный лок на блоб, чтобы его не могли модифицировать. Функция очень удобна в ситуации с множеством worker-ов, пытающихся совершить одну и ту же операцию, вы же хотите, чтобы только один из них всё-таки сделал изменение. Подробнее: http://blog.smarx.com/posts/managing-concurrency-in-windows-azure-with-leases.
Функция используется для инициирования загрузки данных кусками.
Функция используется для загрузки кусков (блоков в WABS и частей в AS3) данных.
Функция используется для подтверждения блобов или объектов в соответствующем хранилище. Функцию можно вызывать после загрузки всех блоков или частей.
Функция возвращает список загруженных блоков или частей.
Комментарии:
· WABS позволяет определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match).
Функция используется для отмены выполняющегося процесса загрузки.
В таком виде, в каком реализована эту функциональность в WABS, она вам не нужна. В WABS вы не можете прервать процесс загрузки. Если вы начали загрузку блобов кусками и не вызвали Put Block List в течение 7 дней, загруженные блоки будут удалены.
Если объект, который вы пытаетесь скопировать, имеет размер, больший 5 Гб, вы не сможете использовать функцию Put Object – Copy. Вам придется копировать этот объект с помощью загрузки кускам, и эта функция предназначена как раз для этого. Различие между этой функцией и Upload Part состоит в том, что вместо передачи данных в теле запроса вы указываете объект-источник в формате source_bucket/source_object и диапазон байт, который нужно скопировать. Таким образом нужно поступить со всеми частями копируемого объекта. Перед вызовом этой функции вам необходимо инициировать загрузку кусками и получить Upload Id, который и необходимо передать функции. Для завершения копирования нужно вызвать “Complete Multipart Upload” либо “Abort Multipart Upload”.
Когда вы создаете страничный блоб, используя Put Blob, вы только инициируете его создание, т.е. создаете пустой страничный блоб без содержания. С помощью этой функции можно вставить/обновить данные в страничный блоб, причем подтверждать данные не надо – после вызова этой функции они будут автоматически подтверждены.
Комментарии:
· WABS позволяет определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match).
Важным различием между блочным и страничным блобом является ценообразование – вы платите за блочный блоб полностью, но в случае страничного блоба – только за занятые (ненулевые) страницы. Например, если вы создали блочный блоб на 2 Гб и страничный блоб на 2 Гб и оба из них незаполнены (содержат 0 байт), вы заплатите за 2 Гб блочного блоба, за страничный же блоб плата взиматься не будет. Потом вы запишите 1024 байта в страничный блоб, используя Put Page, и начнете платить за эти 1024 байта.
Эта функция возвращает отсортированный список ненулевых страниц.
У этой функции есть еще одно преимущество – если вы при скачивании страничного блоба вызовете эту функцию, вы будете гарантированно знать, где в блобе хранятся ваши данные, после чего вы сможете скачать не весь блоб, а только занятые страницы, с использованием заголовка Range в функции Get Blob.
Обе системы предоставляют похожий набор функций. В каждой системе есть свой набор функций, отсутствующий в другой системе, но в целом различия в функциональности не такие, как в случае контейнеров блобов и корзин.
Подробные статьи по сравнению Windows Azure Blob Storage и Amazon Simple Storage Service (S3 можно почитать здесь и здесь. В этой заметке я подведу итоги.
Аббревиатуры: Windows Azure Blob Storage - WABS иAmazon Simple Storage Service — AS3.
В таблицу сведены итоги сравнения функций WABS и AS3.
Примечание от переводчика
Несмотря на молодость (по отношению к конкуренту) платформы Windows Azure, Microsoft постарались на славу — между двумя платформами сохраняется относительное равенство в функциональности, и это не может не радовать. Мне очень интересно наблюдать за развитием обеих платформ, и я думаю, что дальше будет ещё интереснее. Кстати, 7 июня Microsoft выкатят глобальные обновления — не пропустите, будет очень классно, как знакомый с нововведениями вам говорю! Мне кажется, что соревнование облачных платформ набирает новый виток, и дальше всё будет зависеть от того, насколько верный вектор развития будет выбран Amazon и Microsoft. Поживем — увидим. Следующий перевод будет посвящён сравнению Windows Azure Blob Services и Google Cloud Service.
UPD: упустил появление Trust Services для Windows Azure: уже сейчас есть возможность шифрования на стороне сервера — подробнее.
В первой части этой статьи мы начали сравнение Windows Azure Blob Storage and Amazon Simple Storage Service (S3), посмотрели на базовые концепции и сравнили ценообразование и функциональность, касающуюся контейнеров блобов и корзин. Читать первую часть.
В этой части статьи мы сравним функциональность, касающуюся блобов и объектов, и закроем сравнение сервисов хранилищ обеих систем, сведя получившиеся данные в одну общую таблицу.
Первая часть цикла — Сравнение Windows Azure Table Storage и Amazon DynamoDB
Вторая часть цикла — Сравнение Windows Azure Blob Storage и Amazon Simple Storage Service (S3) — ч. I
Аббревиатуры: Windows Azure Blob Storage — WABS и Amazon Simple Storage Service — AS3.
Концепции
Перед подробным обсуждением функций я считаю важным пояснить некоторые концепции, стоящие за блобами и объектами.
Блобы и объекты: Блобы WABS и объекты AS3 – это файлы в вашей облачной файловой системе, расположенные в контейнерах блобов и корзинах.
Комментарии:
- Отсутствует ограничение на количество хранимых блобов и объектов, при этом в AS3 это количество просто неизвестно, в WABS же это количество ограничено размером аккаунта хранилища (100 Тб).
- Максимальный размер объекта в AS3 – 5 Тб, в WABS – 1 Тб.
- В WABS есть два типа блобов – блочные, удобные для стриминга (например, картинок, видео, документов) и имеющие максимальный размер в 200 Гб, и страничные, удобные для операций случайного доступа/записи и имеющие максимальный размер в 1 Тб. Общим случаем использование страничного блоба является монтирование VHD в качестве диска в роли Windows Azure. В AS3 подобного разделения нет.
- Обе системы предоставляют богатую функциональность по управлению блобами и объектами. Вы можете копировать, загружать, скачивать и совершать другие операции.
- Обе системы предоставляют возможность защиты содержимого от неавторизованного доступа, причем механизм списков контроля доступа более подробно настраиваем в AS3, где на каждый файл в корзине можно создать собственный ACL. В WABS все происходит на уровне контейнера блобов.
Двумя наиболее важными функциями является загрузка и скачивание, поэтому я предлагаю обсудить сначала их, потом сравнить остальные функции.
Загрузка блобов и объектов
Давайте поговорим о загрузке блобов и объектов в контейнеры и корзины. Есть два механизма загрузки – можно загружать блоб или объект полностью в рамках одного запроса или разделить их на куски (блоки или страницы WABS и части в AS3).
Загрузка в одном запросе
Если загружаемые данные имеют небольшой размер и у вас хорошая скорость подключения, вы можете полностью загрузить эти данные в одном запросе. В WABS для этого используется Put Blob. В AS3 — Put Object.
Загрузка кусками
Можно разделять большие данные, которые неэффективно загружать в одном запросе полностью. Обе системы позволяют разбивать данные на куски (блоки или страницы в WABS и части в AS3) и загружать постепенно. В WABS для блочных блобов необходимо использовать PutBlock и Put Block List, для страничных — Put Page. В AS3 для этого используются функции Initiate Multipart Upload, Upload Part и Complete Multipart Upload либо Abort Multipart Upload.
Есть много причин, по которым можно решить загружать данные кусками:
- Необходимо загрузить весьма большие данные. Обратите внимание, что в WABS один блочный блоб ограничен размером 200 Гб, страничный – 1 Тб, в AS3 же можно иметь один объект до 5 Тб. Такие объемы непрактично загружать в одном запросе.
- Невысокая скорость подключения.
- Обе системы являются облачными сервисами, предназначенными для обработки запросов сотен и тысяч пользователей одновременно, и обе системы ограничат ваши запросы, если они выполняются дольше установленного лимита – в WABS это 10 минут на загрузку 1 Мб данных.
- Разделение больших данных на куски позволяет выполнять параллельную загрузку (соответственно, более быстро загружать данные).
- В случае обрыва загрузки куска вы можете повторить его загрузку, если же оборвется загрузка больших данных, загружающихся в одном запросе, придется загружать всё заново, что очень неэффективно.
- Ограничения системы: WABS не позволяет в одном запросе загружать данные, если их размер превышает 64 Мб. В AS3 такого ограничения нет, но компания рекомендует делить данные на куски, если их размер превышает 100 Мб.
Теперь что касается того, как загрузить данные кусками в каждой из систем. Например, вы хотите загрузить кусками файл размером 100 Мб. Посмотрим, что нужно будет сделать при использовании каждой из платформ.
WABS
Допустим, каждый кусок имеет размер в 1 Мб (несмотря на то, что нет необходимости иметь куски одинакового размера) и вам необходимо совершить загрузку 100 кусков. Берем блочный блоб, каждый из блоков (кусков) которого имеет уникальный идентификатор (BlockId). Для его загрузки используем функцию Put Block. BlockId – строка, зашифрованная Base64, максимальный размер которой ограничен 64 байтами. Все BlockId (100 в нашем случае) должны быть одной длины. При этом неважно, в каком порядке вы будете загружать блоки – вы можете загружать их и параллельно. После загрузки блока WABS кладет его куда-то в хранилище, и хранит 7 дней. После загрузки всех блоков вызываем Put Block List, подтверждая (commit) эти блоки. До момента вызова этой функции к блобу обратиться нельзя и, если вы не подтвердили блоки в течение 7 дней, они будут удалены системой. После вызова функции, основываясь на порядке списка BlockId, WABS воссоздаст блоб и пометит его как доступный. Нет разницы, какие значения будут иметь BlockId (все они могут быть GUID), но важно, в каком порядке вы отправите список BlockId при использовании Put Block List.
Ограничения:
- Блоб можно разделить максимум на 50000 блоков.
- Блоб может иметь максимум 100000 неподтвержденных блоков в любой момент времени.
- Набор неподтвержденных блоков не может иметь размер, больший 400 Гб.
- Все BlockId блоков одного блоба должны быть одной длины, т.е. недопустима ситуация, когда их значения будут равны block8, block9, block11.
- Максимальная длина BlockId – 64 байт.
AS3
Допустим, размер каждого куска – 5 Мб. Каждому куску назначается уникальный идентификатор (Part Number), идентифицирующий кусок и определяющий его позицию в исходном объекте. Этот номер может быть любым номером от 1 до 10000, но они должны быть отсортированы, т.е., если брать нашу ситуацию, то кусок 0-5Мб должен иметь номер 1, кусок 5-10 Мб – 2, и так далее. Но, когда вы начнете загружать эти части, сначала необходимо вызвать функцию Initiate Multipart Upload, которая скажет AS3, что начат процесс передачи объекта по кускам. Функция возвратит Upload Id. Далее для каждого куска надо вызвать функцию Upload Part и передать Upload Id и номер куска, причем неважно, в каком порядке будут загружены куски (можно загружать параллельно). После загрузки всех кусков нужно вызвать функцию Complete Multipart Upload, подтвердив таким образом куски. Для отмены процесса можно вызвать Abort Multipart Upload.
Ограничения:
- Судя по тому, что номер куска должен быть от 1 до 10000, я предполагаю, что объект может быть разделен максимум на 10000 частей.
- Так как номер определяет позицию куска в объекте, его значение важно.
- Каждый кусок должен иметь размер минимум 5 Мб за исключением последнего куска в последовательности, для которого нет ограничений по размеру.
Скачивание блобов и объектов
Для скачивания блобов и объектов существует два механизма – либо скачивание блоба или объекта целиком в одном запросе либо кусками.
В каждой системе есть только одна функция для скачивания — Get Blob в WABS и Get Object в AS3.
Скачивание в одном запросе
Если данные имеют небольшой размер и у вас хорошая скорость подключения, вы можете скачать объект полностью, используя Get Blob в WABS и Get Object в AS3.
Скачивание кусками
Если объект имеет большой размер и вы не уверены, сможете ли скачать его за один раз, вы можете качать кусками, используя ту же функцию с добавлением заголовка Range и определив диапазон байт, необходимый для скачивания.
Процесс скачивания:
- Определить размер объекта. Например, он «весит» 100 Мб.
- Определить размер кусков. Например, вам удобно качать куски по 1 Мб.
- Вызывать Get Blob или Get Object и передавать им соответствующие значения в заголовке Range. Если вы качаете последовательно, ваш первый запрос будет иметь значение этого заголовка “0 – 1048575” (0 – 1 Мб), второй запрос — “1048576 – 2097151” (1 – 2 Мб) и так далее.
- После скачивания положить кусок куда-либо.
- После скачивания всех кусков создать пустой файл размером 100 Мб и заполнить этот файл скачанными кусками.
Функции
Функции, предоставляемые обеими системами, сведены в таблицу ниже.
Обсудим поподробнее эти функции.
WABS |
AS3 |
|
Put Blob/PUT Object |
Да |
Да |
Функция добавляет блоб в контейнер блобов и объект в корзину.
Комментарии:
- В обеих системах функция перезапишет существующий объект с указанным именем. В AS3 с включенным на корзине версионированием будет создана копия объекта. В WABS нужно обрабатывать версионирование собственными силами, используя Snapshot Blob.
- Обе системы позволяют определить свойства для объектов (cache control, тип содержимого и т.д.)
- Обе системы позволяют послать хэш MD5 содержимого для проверки консистентности данных.
- В AS3 можно при создании объекта задать на него ACL, чего нельзя сделать в WABS.
- AS3 позволяет хранить объекты с ограниченной избыточностью. Когда вы вызываете эту функцию, вы определяете опциональным параметром, нужно ли хранить объект с ограниченной избыточностью. Если же параметр опущен, объект сохраняется со стандартной избыточностью.
- Обе системы позволяют указывать метаданные для блобов и объектов в форме коллекции пар ключ-значение. В обеих системах максимальный размер этих метаданных – 8 Кб.
- При создании страничного блоба с использованием этой функции вы только инициируете страничный блоб, но не кладете в него данные. Для вставки данных необходимо использовать функцию Put Page.
- При создании блочного блоба или объекта в AS3 данные отправляются в запросе.
- Максимальный размер блочного блоба, созданного с использованием этой функции, равен 64 Мб. Если размер больше, блоб должен быть разделен на блоки и загружен с помощью Put Block и Put Block List.
- WABS позволяет определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match).
- AS3 поддерживает шифрование объектов на стороне сервера, соответственно вы можете определить, необходимо ли шифровать объект, при запросе. WABS не поддерживает шифрование на стороне сервера, поэтому шифровать объекты необходимо самостоятельно.
WABS |
AS3 |
|
POST Object |
Нет |
Да |
Функция добавляет объект в указанную корзину, используя HTML-форму. POST является альтернативой PUT и позволяет реализовать загрузку объекта с помощью браузера. Параметры, переданные PUT с помощью HTTP-заголовков, передаются в случае POST как тело зашифрованного сообщения multipart/form-data.
WABS |
AS3 |
|
Get Blob/GET Object |
Да |
Да |
Функция позволяет скачать блоб из контейнера или корзины.
Комментарии:
- Можно качать кусками, указав количество байт в заголовке Range.
- В WABS функция также возвращает метаданные для скачиваемого блоба.
- WABS позволяет определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match).
- В AS3 можно переопределять значения конкретных заголовков ответа, используя параметры запроса (кроме анонимных запросов). Запрос должен быть подписан с заголовком Authorization или использовать преподписанный URL.
- Можно использовать эту функцию для получения версий блобов и объектов – для получения версии блоба нужно указать дату/время снапшота блоба, для получения версии объекта в AS3 – указать Version Id. Если эти параметры опущены, возвращается текущая версия объекта.
WABS |
AS3 |
|
GET Object torrent |
Нет |
Да |
AS3 позволяет использовать объекты с помощью протокола BitTorrent, который также может сократить количество передаваемого траффика. Подробнее про использование BitTorrent и AS3 — здесь.
Функцию можно вызывать только на объектах, имеющих размер менее 5 Гб.
WABS |
AS3 |
|
GET Object ACL |
Нет |
Да |
В AS3 можно указать ACL на уровне отдельного объекта (в WABS ACL можно указать только на уровне контейнера блобов). Эта функция используется для получения информации об ACL, указанном для объекта
Интересным моментом является то, что если вы используете разные версии объекта, каждая версия будет иметь отдельный ACL. Для получения ACL конкретной версии объекта необходимо передать функции Version Id версии.
WABS |
AS3 |
|
PUT Object ACL |
Нет |
Да |
Функция позволяет указать ACL для объекта. Как указывалось выше, каждая версия объекта имеет собственный ACL. Для указания ACL для конкретной версии объекта функции необходимо передать Version Id этой версии.
WABS |
AS3 |
|
Get Blob Properties/HEAD Object |
Да |
Да |
Функция используется для получения свойств блоба и метаданных объекта, но не возвращает содержимое блоба.
Комментарии:
- Get Blob Properties в WABS возвращает набор определенных пользователем метаданных, стандартных свойств HTTP и системных свойств для блоба, тогда как HEAD Object в AS3 возвращает только метаданные объекта.
- WABS позволяет определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match).
- Эту функцию можно использовать для получения свойств конкретной версии блоба или объекта. Для получения этой информации необходимо указать дату/время снапшота блоба в WABS и Version Id необходимой версии в AS3. Если эти параметры опущены, возвращается информация о текущей версии.
WABS |
AS3 |
|
Set Blob Properties |
Да |
Нет |
Функция определяет системные свойства блоба в WABS. Недоступна в AS3. При создании объекта можно указать только системные свойства.
Свойства, доступные для определения, включают в себя: Cache Control, Content Type, Content MD5, Content Encoding, Content Language. Обратите внимание, что вы не имеете права переопределять эти свойства для снапшота блоба.
WABS позволяет определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match).
WABS |
AS3 |
|
Get Blob Metadata/Head Object |
Да |
Да |
Функция возвращает определенные пользователем метаданные. Эту функцию можно использовать для получения свойств конкретной версии блоба или объекта. Для получения этой информации необходимо указать дату/время снапшота блоба в WABS и Version Id необходимой версии в AS3. Если эти параметры опущены, возвращается информация о текущей версии.
WABS |
AS3 |
|
Set Blob Metadata |
Да |
Нет |
Функция используется для указания словаря метаданных в виде коллекции записей ключ-значение для блобов в WABS.
Комментарии:
- Функция перезаписывает существующие метаданные, поэтому нельзя просто обновить одну пару ключ-значение.
- Максимальный размер метаданных равен 8 Кб.
- Имя метаданных должно быть разрешенным идентификатором C#.
WABS |
AS3 |
|
Delete Blob/DELETE Object |
Да |
Да |
Функция удаляет блоб или объект из хранилища.
Комментарии:
- В AS3 функция удаляет null-версию (если таковая была) объекта и вставляет маркер на удаление, который затем становится версией объекта. Если не было null-версии, никакие из объектов не удаляются.
- В WABS можно использовать эту функцию для удаления только снапшотов без удаления исходника. Если исходник удаляется, все его снапшоты также удаляются.
- Как я понимаю, в AS3 при удалении объекта все его версии остаются нетронутыми, что мне кажется достаточно удобной защитой от случайных операций удаления.
- Эту функцию можно использовать для удаления конкретных версий блоба или объекта – для этого нужно указать дату/время снапшота блоба в WABS и Version Id необходимой версии в AS3.
· WABS позволяет определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match).
- В AS3 можно использовать Multi Factor Authentification (MFA) Delete, что предоставляет дополнительный уровень безопасности. Подробнее про MFA — здесь.
WABS |
AS3 |
|
Delete Multiple Objects |
Нет |
Да |
Эта функция позволяет удалить в одном HTTP-запросе несколько объектов из корзины – для этого необходимо знать ключи удаляемых объектов. Можно удалять также конкретные версии одного или нескольких объектов. В одном запросе можно удалить до 1000 объектов.
WABS |
AS3 |
|
Copy Blob/Put Object – Copy |
Да |
Да |
Функция копирует блоб куда-либо из исходного расположения.
Комментарии:
· Обе системы позволяют определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match). Эти условия можно определить как на исходнике, так и на конечной копии в WABS и на исходнике в AS3.
· WABS позволяет копировать объекты из контейнера в контейнер только в пределах одного аккаунта хранилища. В AS3 подобного ограничения нет. Если корзины, между которыми происходит обмен, принадлежат к одному аккаунту, объект будет скопирован. Однако, если вы создали объект, используя API для загрузки кусками, вы не сможете копировать объект из региона в регион.
· Обе системы позволяют вам скопировать существующие метаданные или указать метаданные для конечной копии.
· AS3 реализует эту функцию как комбинацию GET Object и PUT Object.
- Использовать эту функцию можно с объектами не более 5 Гб в размере. Если размер превышает 5 Гб, необходимо совершить загрузку кусками.
- В AS3 при копировании удаляется определенный ACL и на объект ставится разрешение как private.
Полезные советы:
- Обе системы не поддерживают переименование объекта. Переименование объекта можно реализовать, сначала скопировав объект, после чего удалив его.
- Можно также «повысить» версию блоба или объекта до «текущей» версии. Для этого нужно указать как исходник для копирования версионированный блоб (указав на его снапшот) или объект (указав на его Version Id) и конечную копию как неверсионированный блоб или объект.
WABS |
AS3 |
|
Snapshot Blob |
Да |
Нет |
Функция создает read-only копию блоба – так реализуется версионирование WABS. Как я упоминал в предыдущих статьях, AS3 самостоятельно реализует версионирование. В WABS же версионирование реализовано на уровне конкретного блоба и версионирование этого блоба переходит в ответственность разработчика.
Комментарии:
- Функция создает Read-only копию блоба – снапшот. Снапшоты могут быть загружены, скопированы или удалены, но не модифицированы.
- В отличие от AS3, где версии объекта назначается Version Id, каждому снапшоту назначается значение дату/времени, уникально идентифицирующее данный снапшот.
· WABS позволяет определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match).
- Можно «повысить» снапшот до версии блоба-исходника, используя функцию Copy Blob.
WABS |
AS3 |
|
Lease Blob |
Да |
Нет |
Функция позволяет поставить одноминутный лок на блоб, чтобы его не могли модифицировать. Функция очень удобна в ситуации с множеством worker-ов, пытающихся совершить одну и ту же операцию, вы же хотите, чтобы только один из них всё-таки сделал изменение. Подробнее: http://blog.smarx.com/posts/managing-concurrency-in-windows-azure-with-leases.
|
WABS |
AS3 |
Initiate Multipart Upload |
Нет |
Да |
Функция используется для инициирования загрузки данных кусками.
WABS |
AS3 |
|
Put Block/Upload Part |
Да |
Да |
Функция используется для загрузки кусков (блоков в WABS и частей в AS3) данных.
WABS |
AS3 |
|
Put Block List/Complete Multipart Upload |
Да |
Да |
Функция используется для подтверждения блобов или объектов в соответствующем хранилище. Функцию можно вызывать после загрузки всех блоков или частей.
WABS |
AS3 |
|
Get Block List/List Parts |
Да |
Да |
Функция возвращает список загруженных блоков или частей.
Комментарии:
- WABS имеет два списка блоков для блоба – список успешно подтвержденных блоков и список неподтвержденных блоков, которые были загружены, но не были подтверждены.
- В одном запросе функции AS3 возвратит до 1000 номеров частей. Если останутся ещё части, AS3 возвратит continuation token. Можно указывать, сколь много номеров будет возвращено.
· WABS позволяет определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match).
WABS |
AS3 |
|
Abort Multipart Upload |
Нет |
Да |
Функция используется для отмены выполняющегося процесса загрузки.
В таком виде, в каком реализована эту функциональность в WABS, она вам не нужна. В WABS вы не можете прервать процесс загрузки. Если вы начали загрузку блобов кусками и не вызвали Put Block List в течение 7 дней, загруженные блоки будут удалены.
WABS |
AS3 |
|
Upload Part – Copy |
Нет |
Да |
Если объект, который вы пытаетесь скопировать, имеет размер, больший 5 Гб, вы не сможете использовать функцию Put Object – Copy. Вам придется копировать этот объект с помощью загрузки кускам, и эта функция предназначена как раз для этого. Различие между этой функцией и Upload Part состоит в том, что вместо передачи данных в теле запроса вы указываете объект-источник в формате source_bucket/source_object и диапазон байт, который нужно скопировать. Таким образом нужно поступить со всеми частями копируемого объекта. Перед вызовом этой функции вам необходимо инициировать загрузку кусками и получить Upload Id, который и необходимо передать функции. Для завершения копирования нужно вызвать “Complete Multipart Upload” либо “Abort Multipart Upload”.
|
WABS |
AS3 |
Put Page |
Да |
Нет |
Когда вы создаете страничный блоб, используя Put Blob, вы только инициируете его создание, т.е. создаете пустой страничный блоб без содержания. С помощью этой функции можно вставить/обновить данные в страничный блоб, причем подтверждать данные не надо – после вызова этой функции они будут автоматически подтверждены.
Комментарии:
- Для помещения данных в блоб необходимо указать значение заголовка диапазона байт “Byte Range”. Начальный сдвиг диапазона должен быть абсолютным значением 512-1. Примеры разрешенных диапазонов байт – 0-511, 512-1023 и так далее.
- С помощью этой функции можно либо записать данные в страничный блоб, либо очистить от данных конкретный диапазон байт.
· WABS позволяет определить предусловия, которые должны быть удовлетворены для успешного завершения этой функции (If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match).
WABS |
AS3 |
|
Get Page Ranges |
Да |
Нет |
Важным различием между блочным и страничным блобом является ценообразование – вы платите за блочный блоб полностью, но в случае страничного блоба – только за занятые (ненулевые) страницы. Например, если вы создали блочный блоб на 2 Гб и страничный блоб на 2 Гб и оба из них незаполнены (содержат 0 байт), вы заплатите за 2 Гб блочного блоба, за страничный же блоб плата взиматься не будет. Потом вы запишите 1024 байта в страничный блоб, используя Put Page, и начнете платить за эти 1024 байта.
Эта функция возвращает отсортированный список ненулевых страниц.
У этой функции есть еще одно преимущество – если вы при скачивании страничного блоба вызовете эту функцию, вы будете гарантированно знать, где в блобе хранятся ваши данные, после чего вы сможете скачать не весь блоб, а только занятые страницы, с использованием заголовка Range в функции Get Blob.
Резюме
Обе системы предоставляют похожий набор функций. В каждой системе есть свой набор функций, отсутствующий в другой системе, но в целом различия в функциональности не такие, как в случае контейнеров блобов и корзин.
Сравнение Windows Azure Blob Storage и Amazon Simple Storage Service (S3)–Резюме
Подробные статьи по сравнению Windows Azure Blob Storage и Amazon Simple Storage Service (S3 можно почитать здесь и здесь. В этой заметке я подведу итоги.
Аббревиатуры: Windows Azure Blob Storage - WABS иAmazon Simple Storage Service — AS3.
В таблицу сведены итоги сравнения функций WABS и AS3.
WABS |
AS3 |
|
Текущая версия сервиса |
2011-08-18 |
2006-03-01 |
Ограничение хранилища |
До 100Тб |
Неограничено |
Облачная файловая система |
Да |
Да |
Возможность пересылки дисков для передачи огромных объемов данных |
Нет |
Да |
Подерживаемые протоколы |
HTTP / HTTPS |
HTTP / HTTPS / BitTorrent |
Возможность выставлять счет клиентам за потребленные ими данные |
Нет |
Да |
Поддержка шифрования на стороне сервера |
Нет |
Да |
Поддержка ограниченной избыточности |
Нет |
Да |
Поддерживаемый уровень иерархии |
2 |
2 |
Контейнеры блобов и корзины |
||
Создание контейнеров блобов и корзин |
Да |
Да |
Количество контейнеров блобов и корзин |
Неограничено |
Неограничено |
Минимальная/максимальная длина названия корзины или контейнера блобов |
3/63 |
3/63 |
Чувствительность к регистру в именах контейнеров блобов и корзин |
Нижний регистр |
Нижний регистр |
Разрешенные в именах контейнеров блобов и корзин символы |
Alphanumeric, дефис (-) |
Alphanumeric, дефис (-), точка (.) |
Поддержка виртуального хостинга |
Нет |
Да |
Поддержка хостинга path-style |
Да |
Да |
Возможность определения ACL в момент создания |
Да |
Да |
ACL по умолчанию |
Private |
Private |
Указание собственных метаданных |
Да |
Нет |
Получение списка контейнеров блобов и корзин |
Да |
Да |
Максимальное количество возвращенных одним вызовом функции контейнеров блобов или корзин |
5000 |
Не указано |
Возвращение части списка контейнеров блобов и корзин с использованием фильтрации по префиксу |
Да |
Да |
Удаление контейнеров блобов и корзин |
Да |
Да |
Контейнер блобов или корзина должна быть пустой перед удалением |
Нет |
Да |
Получение списка блобов или объектов |
Да |
Да |
Максимальное количество блобов или объектов, возвращенное одним вызовом функции |
5000 |
1000 |
Возможность указания верхнего лимита количества возвращаемых блобов или объектов в одном вызове функции |
Да |
Да |
Поддержка разделителя для создания иллюзии иерархии в виде папок |
Да |
Да |
Фильтрация возвращаемого списка блобов или объектов по префиксу |
Да |
Да |
Получение списка версионированных блобов или объектов |
Да |
Да |
Получение списка неподтвержденных блобов или объектов |
Да |
Да |
Логирование запросов к блобам или объектам |
Да |
Да |
Логирование запросов к конкретным блобам или объектам |
Нет |
Да |
Получение конфигурации логирования запросов к блобам или объектам |
Да |
Да |
Определение ACL на контейнер блобов или корзину |
Да |
Да |
Возможные значения ACL |
Container, Blob, Private |
READ, WRITE, READ_ACP, WRITE_ACP, FULL_CONTROL |
Определение различных ACL для различных пользователей |
Нет |
Да |
Определение собственных метаданных для контейнера блобов или корзины |
Да |
Нет |
Получение определенных пользователем метаданных для контейнера блобов или корзины |
Да |
Нет |
Версионирование объектов |
Да |
Да |
Версионирование управляется системой |
Нет |
Да |
Настройка версионирования для контейнеров блобов или корзин |
Нет |
Да |
Получение конфигурации версионирования контейнера блобов или корзины |
Нет |
Да |
Автоматическое удаление содержимого контейнера блобов или корзины по истечении определенного срока |
Нет |
Да |
Настройка автоматического удаления содержимого контейнера блобов или корзины по истечении определенного срока |
Нет |
Да |
Получение настроек автоматического удаления содержимого контейнера блобов или корзины по истечении определенного срока |
Нет |
Да |
Удаление настроек автоматического удаления содержимого контейнера блобов или корзины по истечении определенного срока |
Нет |
Да |
Определение политик доступа на контейнер блобов или корзины для предотвращения несанкционированного доступа |
Нет |
Да |
Получение политик доступа на контейнер блобов или корзины для предотвращения несанкционированного доступа |
Нет |
Да |
Удаление политик доступа на контейнер блобов или корзины для предотвращения несанкционированного доступа |
Нет |
Да |
Получение уведомлений о произошедшем с контейнером блобов или корзиной событии |
Нет |
Да |
Настройка уведомлений о произошедшем с контейнером блобов или корзиной событии |
Нет |
Да |
Получение уведомлений о произошедшем с контейнером блобов или корзиной событии |
Нет |
Да |
Может ли другой пользователь платить за скачивание из контейнера блобов или корзины |
Нет |
Да |
Определение пользователя, который будет платить за скачивание из контейнера блобов или корзины |
Нет |
Да |
Получение конфигурации пользователя, который будет платить за скачивание из контейнера блобов или корзины |
Нет |
Да |
Размещение статического вебсайта в контейнере блобов или корзине с поддержкой страниц по умолчанию и ошибок |
Нет |
Да |
Настройка размещения статического вебсайта в контейнере блобов или корзине с поддержкой страниц по умолчанию и ошибок |
Нет |
Да |
Получение настройки размещения статического вебсайта в контейнере блобов или корзине с поддержкой страниц по умолчанию и ошибок |
Нет |
Да |
Удаление настройки размещения статического вебсайта в контейнере блобов или корзине с поддержкой страниц по умолчанию и ошибок |
Нет |
Да |
Блобы и объекты |
||
Максимальный размер блоба или объекта |
200 Гб / 1 Тб |
5 Тб |
Типы блобов или объектов |
Блочный, страничный |
- |
Загрузка блобов или объектов |
Да |
Да |
Максимальный размер блоба или объекта, который можно загрузить без разделения его на куски |
64 Мб |
Ограничения отсутствуют |
Загрузка блобов или объектов кусками |
Да |
Да |
Максимальное количество кусков для загрузки |
50000 |
10000 |
Минимальный размер куска |
Нет |
5 Мб |
Определение метаданных в момент загрузки |
Да |
Да |
Определение ACL в момент загрузки |
N/A |
Да |
Определение, нужно ли использовать ограниченную избыточность, в момент загрузки |
N/A |
Да |
Загрузка с условием |
Да |
Нет |
Загрузка блобов или объектов с использованием HTML-форм и POST |
Нет |
Да |
Скачивание блобов или объектов |
Да |
Да |
Скачивание блобов или объектов кусками |
Да |
Да |
Переопределение заголовков ответа при скачивании блобов или объектов |
Нет |
Да |
Скачивание и распространение блобов или объектов через Torrent |
Нет |
Да |
Получение ACL для блобов или объектов |
Нет |
Да |
Определение ACL для блобов или объектов |
Нет |
Да |
Получение свойств блобов или объектов |
Да |
Да |
Определение свойств блобов или объектов |
Да |
Нет |
Получение определенных пользоваетелем метаданных для блобов или объектов |
Да |
Да |
Определение собственных метаданных для блобов или объектов |
Да |
Нет |
Удаление блобов или объектов |
Да |
Да |
Поддержка Multi Factor Authentication (MFA) delete |
Нет |
Да |
Удаление по условию |
Да |
Нет |
Удаление нескольких блобов или объектов одним запросом |
Нет |
Да |
Копирование блобов или объектов |
Да |
Да |
Копирование по условию |
Да |
Да |
Создание read-only снапшота блоба или объектов |
Да |
Нет |
Получение эксклюзивного лока (lock) на блобе или объекте |
Да |
Нет |
Примечание от переводчика
Несмотря на молодость (по отношению к конкуренту) платформы Windows Azure, Microsoft постарались на славу — между двумя платформами сохраняется относительное равенство в функциональности, и это не может не радовать. Мне очень интересно наблюдать за развитием обеих платформ, и я думаю, что дальше будет ещё интереснее. Кстати, 7 июня Microsoft выкатят глобальные обновления — не пропустите, будет очень классно, как знакомый с нововведениями вам говорю! Мне кажется, что соревнование облачных платформ набирает новый виток, и дальше всё будет зависеть от того, насколько верный вектор развития будет выбран Amazon и Microsoft. Поживем — увидим. Следующий перевод будет посвящён сравнению Windows Azure Blob Services и Google Cloud Service.
UPD: упустил появление Trust Services для Windows Azure: уже сейчас есть возможность шифрования на стороне сервера — подробнее.