Головна сторінка Випадкова сторінка КАТЕГОРІЇ: АвтомобіліБіологіяБудівництвоВідпочинок і туризмГеографіяДім і садЕкологіяЕкономікаЕлектронікаІноземні мовиІнформатикаІншеІсторіяКультураЛітератураМатематикаМедицинаМеталлургіяМеханікаОсвітаОхорона праціПедагогікаПолітикаПравоПсихологіяРелігіяСоціологіяСпортФізикаФілософіяФінансиХімія |
Розділ II. ЗОБОВ'ЯЗАННЯ З ОДНОСТОРОННІХ ДІЙДата добавления: 2015-10-15; просмотров: 649
Для работы с Windows Azure Storage пользователь должен создать учетную запись хранилища. Выполняется это через веб-интерфейс портала Windows Azure Portal. При создании учетной записи пользователь получает 256-разрядный секретный ключ, который впоследствии используется для аутентификации запросов этого пользователя к системе хранения. В частности, с помощью этого секретного ключа создается подпись HMAC SHA256 для запроса. Эта подпись передается с каждым запросом данного пользователя для обеспечения аутентификации через проверку достоверности подписи HMAC Благодаря Windows Azure Blob приложения получают возможность хранения в облаке больших объектов, до 50 ГБ каждый. Он поддерживает высоко масштабируемую систему больших двоичных объектов ( blob ), в которой наиболее часто используемые blob распределяются среди множества серверов для обслуживания необходимых объемов трафика. Более того, эта система характеризуется высокой надежностью и длительностью хранения. Данные доступны в любой момент времени из любой точки планеты и продублированы, по крайней мере, трижды для повышения надежности. Кроме того, обеспечивается строгая согласованность, что гарантирует немедленную доступность объекта при его добавлении или обновлении: все изменения, внесенные в предыдущей операции записи, немедленно видны при последующем чтении. Рассмотрим модель данных Azure Blob. На рисунке ниже представлено пространство имен Windows Azure Blob.
Для доступа к Windows Azure Blob используется приведенные выше подходы. URI конкретного blob структурирован следующим образом: http://<учетнаязапись>.blob.core.windows.net/<контейнер>/<имяblob> Первая часть имени хоста образована именем учетной записи хранилища, за которым следует ключевое слово "blob". Это обеспечивает направление запроса в часть Windows Azure Storage, которая обрабатывает запросы blob. За именем хоста идет имя контейнера, "/" и затем имя blob. Существуют ограничения именования учетных записей и контейнеров (подробнее об этом рассказывается в документе Windows Azure SDK). Например, имя контейнера не может включать символ "/". Еще несколько замечаний по поводу контейнеров:
Рассмотрим интерфейс REST объектов Blob. Любой доступ к Windows Azure Blob выполняется через стандартные HTTP-команды PUT/GET/DELETE интерфейса REST. К командам HTTP/REST, поддерживаемым для реализации операций с blob, относятся:
Все эти операции с blob – Put, Get и Delete, – могут быть выполнены с использованием следующего URL: http://<учетнаязапись>.blob.core.windows.net/<контейнер>/<имяblob> Один запрос PUT обеспечивает возможность загрузки в облако blob размером до 64 МБ. Для загрузки blob, размер которого превышает 64 МБ, используется технология загрузки блоками, описываемый в следующем разделе. Полное описание всех API REST можно найти в документе Windows Azure SDK. Один из целевых сценариев Windows Azure Blob – эффективная загрузка объектов blob, размером десятки гигабайт. Windows Azure Blob обеспечивает это следующим образом: Загружаемый Blob (например, Movie.avi) разбивается на последовательные блоки. Например, ролик размером 10ГБ может быть разбит на 2500 блоков по 4МБ, при этом первый блок будет представлять диапазон байтов данных от 1 до 4194304, второй блок – от 4194305 до 8388608 и т.д.
На следующем рисунке представлено место блоков в концепции данных Windows Azure Blob.
Как описывалось ранее, доступ к объектам blob может осуществляться посредством операций PUT и GET с использованием следующего URL: http://<учетнаязапись>.blob.core.windows.net/<контейнер>/<имяblob> В примере, представленном на рисунке 7.2, рисунки со следующими URL могут быть размещены одной операцией PUT: http://sally.blob.core.windows.net/pictures/IMG001.JPG http://sally.blob.core.windows.net/pictures/IMG002.JPG е же URL могут использоваться для возвращения объектов blob. Одна операция PUT может обеспечить размещение в хранилище объектов blob размером до 64МБ. Для сохранения объектов blob размером больше 64МБ и вплоть до 50 ГБ необходимо сначала разместить все блоки посредством соответствующего количества операций PUT и затем, с помощью все той же операции PUT, передать список блоков, чтобы обеспечить пригодную для чтения версию blob. В примере, который иллюстрирует рис. 2, только после размещения всех блоков и подтверждения их принадлежности blob посредством списка блоков blob может быть считан с использованием следующего URL: http://sally.blob.core.windows.net/pictures/MOV1.AVI Операции GET всегда выполняются на уровне blob и не предполагают использования блоков. Рассмотрим абстракции данных блоков. Каждый блок идентифицирует ID блока размером до 64 байт. Область действия ID блока ограничена именем blob, поэтому разные объекты blob могут иметь блоки с одинаковыми ID. Блоки неизменны. Каждый блок может быть размером до 4МБ, и один blob может включать блоки разного размера. Windows Azure Blob обеспечивает следующие операции уровня блока:
Во всех рассматриваемых далее примерах используется blob "MOV1.avi", располагающийся в контейнере "movies" (ролики) под учетной записью "sally". Ниже представлен пример REST-запроса для размещения блока размером 4МБ посредством операции PUT block. Обратите внимание, что используется HTTP-команда PUT. "?comp=block" указывает на то, что это операция PUT block. Затем задается BlockID. Параметр Content-MD5 может быть задан для защиты от ошибок передачи по сети и обеспечения целостности. В данном случае, Content-MD5 – это контрольная сумма MD5 данных блока в запросе. Контрольная сумма проверяется на сервере, в случае несовпадения возвращается ошибка. Параметр Content-Length (Длина содержимого) определяет размер содержимого блока. Также в заголовке HTTP-запроса имеется заголовок авторизации, как показано ниже. PUT http://sally.blob.core.windows.net/movies/MOV1.avi ?comp=block &blockid=BlockId1 &timeout=60 HTTP/1.1 Content-Length: 4194304 Content-MD5: HUXZLQLMuI/KZ5KDcJPcOA== Authorization: SharedKey sally: F5a+dUDvef+PfMb4T8Rc2jHcwfK58KecSZY+l2naIao= x-ms-date: Mon, 27 Oct 2008 17:00:25 GMT ……… Block Data Contents ……… Ниже представлен пример REST-запроса для операции PUT blocklist. Обратите внимание, что используется HTTP-команда PUT. "?comp=blocklist" указывает на то, что это операция PUT blocklist. Список блоков задается в теле HTTP-запроса в формате XML, как показано в примере ниже. Обратите внимание, что значение поля Content-Length в заголовке запроса соответствует размеру тела запроса, а не размеру создаваемого blob. Также в заголовке HTTP-запроса имеется заголовок авторизации, как показано ниже. PUT http://sally.blob.core.windows.net/movies/MOV1.avi ?comp=blocklist &timeout=120 HTTP/1.1 Content-Length: 161213 Authorization: SharedKey sally: QrmowAF72IsFEs0GaNCtRU143JpkflIgRTcOdKZaYxw= x-ms-date: Mon, 27 Oct 2008 17:00:25 GMT <?xml version="1.0" encoding="utf-8"?> <BlockList> <Block>BlockId1</Block> <Block>BlockId2</Block> ……………… </BlockList> Ниже представлен пример REST-запроса для операции GET blob. В данном случае используется HTTP-команда GET. Этот запрос обеспечит извлечение всего содержимого заданного blob. Если для контейнера, которому принадлежит blob (в данном примере "movies"), задана политика совместного использования "Private", для получения blob необходимо пройти аутентификацию. Если задана политика совместного использования "Public-Read", аутентификация не требуется, и заголовок аутентификации в заголовке запроса не нужен. GET http://sally.blob.core.windows.net/movies/MOV1.avi HTTP/1.1 Authorization: SharedKey sally: RGllHMtzKMi4y/nedSk5Vn74IU6/fRMwiPsL+uYSDjY= X-ms-date: Mon, 27 Oct 2008 17:00:25 GMT Как показано в примере ниже, также поддерживается операция GET для извлечения диапазона байт заданного blob. GET http://sally.blob.core.windows.net/movies/MOV1.avi HTTP/1.1 Range: bytes=1024000-2048000 Загрузка blob в виде списка блоков обладает следующими преимуществами:
Загрузка большого blob может занимать довольно длительное время. При этом загруженные, но не использованные блоки занимают место в хранилище. Многие загруженные блоки могут никогда не войти в список PUT blocklist. В случае отсутствия активности для данного blob в течение длительного периода времени (в настоящее время этот период составляет неделю), эти неиспользованные блоки будут удалены системой в процессе сборки мусора. Любопытным является сценарий параллельной загрузки блоков для одного blob. В этом случае заслуживают внимания два вопроса:
· Windows Azure Blob поддерживает условные PUT и GET, которые обеспечивают реализацию эффективной обработки параллелизма и клиентского кэширования. · Условный PUT может использоваться в ситуациях, когда один blob обновляется несколькими пользователями. Например, загрузка blob может выполняться на основании времени последнего изменения; это гарантирует, что версия изменяемого blob аналогична версии, которую изменяет клиент. Так может быть реализован совместный доступ с нежесткой блокировкой. Скажем, два клиента, А и В, обновляют один и тот же blob. Они параллельно выполняют чтение версии blob, вносят в нее какие-то изменения и вновь загружают в хранилище. В этом сценарии каждый из клиентов записывает время последнего изменения извлеченного из хранилища blob (пусть время последнего изменения будет Х). Когда они готовы загрузить обновленную версию blob назад в хранилище, они делают это с помощью условного PUT на основании сохраненного при извлечении blob времени последнего изменени я. В операции должно быть определено, что условием выполнения PUT является "если не изменялся с момента Х". Таким образом, если blob был изменен другим клиентом в промежуток времени с момента Х, операция обновления даст сбой, и клиент получит уведомление об этом. · Условный GET может использоваться для эффективной обработки вопросов соответствия содержимого кэшей. Например, клиент имеет локальный кэш объектов blob, в котором кэшируются чаще всего извлекаемые из хранилища blob. Для каждого кэшированного blob записывается время его последнего изменения. Когда клиентский кэш принимает решение обновить объекты blob из хранилища, он может использовать условный GET на основании времени изменения (с условием "если изменен с момента Х"). Таким образом, из хранилища будут загружаться только те объекты blob, которые были изменены в период времени, прошедший с момента Х, и отличаются от своей кэшированной копии. · Система Blob обеспечивает интерфейс для перечисления объектов blob контейнера. Поддерживается иерархический перечень объектов blob контейнера и механизм продолжения, что позволяет выполнять перечисление большого количества объектов blob. · Интерфейс ListBlobs поддерживает параметры "prefix" (префикс) и "delimiter" (разделитель), которые обеспечивают возможность построения иерархического перечня объектов blob. Например, пусть в учетной записи "sally" имеется контейнер "movies" объектов blob с такими именами: · Action/Rocky1.wmv · Action/Rocky2.wmv · Action/Rocky3.wmv · Action/Rocky4.wmv · Action/Rocky5.wmv · Drama/Crime/GodFather1.wmv · Drama/Crime/GodFather2.wmv · Drama/Memento.wmv · Horror/TheBlob.wmv· Как видите, "/" используется в качестве разделителя для создания подобной каталогу иерархии имен blob. Чтобы получить список всех "папок", задаем в запросе ListBlobs "delimiter=/". И вот как будет выглядеть запрос и часть ответа: · Запрос: · GET http://sally.blob.windows.net/movies?comp=list&delimiter=/ · Ответ: · <BlobPrefix>Action</BlobPrefix> · <BlobPrefix>Drama</BlobPrefix> · <BlobPrefix>Horror</BlobPrefix>· Обратите внимание, тег "BlobPrefix" указывает на то, что соответствующая запись является префиксом имени blob, а не полным именем blob. Также следует заметить, что один и тот же префикс возвращается в результате только один раз. · Следующим этапом можно сочетать префикс и разделитель для получения списка содержимого "подпапки". Например, задавая "prefix=Drama/" и "delimiter=/", получаем список всех подпапок и файлов каталога "Drama": · Запрос: · GET http://sally.blob.windows.net/movies?comp=list &prefix=Drama/ &delimiter=/· Ответ: · <BlobPrefix>Drama/Crime</BlobPrefix> · <Blob>Drama/Memento.wmv</Blob>· Обратите внимание, что "Drama/Memento.wmv" – это полное имя blob, следовательно, оно так и обозначено. · Интерфейс ListBlobs обеспечивает возможность задавать "maxresults", т.е. максимальное число результатов, которое должно быть возвращено в этом вызове. Более того, система определяет верхний предел для максимального числа результатов, которые могут быть возвращены одним вызовом (более подробную информацию об этом можно найти в документации по SDK). По достижении меньшего из этих двух предельных значений вызов возвращается с соответствующим количеством результатов и непрозрачным "NextMarker" (маркер следующего). Наличие этого маркера свидетельствует о том, что данный запрос не обеспечил возвращения всех возможных результатов. "NextMarker" может использоваться для продолжения составления списка для следующей страницы результатов. · В предыдущем примере предположим, что требуется составить список всех объектов blob каталога "Action", возвращая каждый раз максимум по 3 результата. В этом случае первый набор результатов был бы таким: · Запрос: · GET http://sally.blob.windows.net/movies?comp=list &prefix=Action &maxresults=3 \· Ответ: · <Blob>Action/Rocky1.wmv</Blob> · <Blob>Action/Rocky2.wmv</Blob> · <Blob>Action/Rocky3.wmv</Blob> · </NextMarker> OpaqueMarker1</NextMarker>· С первым набором объектов blob возвращается и непрозрачный маркер, который может быть передан во второй вызов ListBlobs. Тогда этот вызов обеспечит возвращение следующих результатов: · Запрос: · GET http://sally.blob.windows.net/movies?comp=list &prefix=Action &maxresults=3 · &marker=OpaqueMarker1· Ответ: · <Blob>Action/Rocky4.wmv</Blob> · <Blob>Action/Rocky5.wmv</Blob> · </NextMarker></NextMarker>· Как показано выше, возвращены оставшиеся объекты blob каталога; "NextMarker" пуст, это свидетельствует о том, что получены все результаты.
|