Блог Белоцерковского Александра

Пояснения по нововведениям в Windows Azure: сервисы хранилища. Ч.2.

Advertisements

Сервисы хранилища. Ч. 1

Продолжаем разбирать нововведения.

В этой части: снижение цен, Shared Access Signatures для таблиц и очередей, кросс-аккаунтовое копирование и усовершенствованный механизм лизинга блобов, изменение в API.

В следующих частях: подробно про Shared Access Signatures, подробно и с кодом про копирование блобов между несколькими аккаунтами.

Новые фичи

С выходом новой версии REST API “2012-02-12” были соответствующим образом, во-первых, обновлена клиентская библиотека для Java и выпущен CTP клиентской библиотеки .NET (исходники библиотеки). К новым фичам, внедренным в платформу, относятся:

x-s-copy-status (или CopyStatus)

Текущий статус операции копирования: pending (поставлено в план), success (завершена успешно), aborted (аварийно завершена клиентом), failed (не завершена из-за возникшей ошибки)

x-ms-copy-id (CopyId)

ID операции копирования, который можно использовать для мониторинга процесса копирования или его отмены

x-ms-copy-status-description (CopyStatusDescription)

Расширенная информация об ошибках

x-ms-copy-progress (CopyProgress)

Прогресс копирования блоба в формате X/Y, где X – количество скопированных байт, Y – всего байт

x-ms-copy-completion-time (CopyCompletionTime)

Время завершения последней операции копирования

А теперь немного кода от команды разработки. В коде ниже получается лизинг с указанным ID лизинга, на 30 секунд, после чего в этом же коде снова получается лизинг, понижающий длительность лизинга до 15 секунд

CloudBlobClient client = storageAccount.CreateCloudBlobClient();

CloudBlobContainer container = client.GetContainerReference(containerName);

CloudBlockBlob blob = container.GetBlockBlobReference(blobName);

// получение лизинга на 30 секунд с указанием определенного

// ID лизинга. Если мы укажем null вместо длительности, лизинг не будет иметь

// временных ограничений. 

blob.AcquireLease(TimeSpan.FromSeconds(30), leaseId);

// получение лизинга ещё раз, но переопределение

// длительности лизинга на 15 секунд 

blob.AcquireLease(TimeSpan.FromSeconds(15), leaseId); 

Как уже упоминалось в примечаниях, теперь можно менять ID лизинга, передав существующий ID операции Change Lease и указав новый ID. Нужно это, как пишет команда разработки, в тех ситуациях, когда необходимо перевести лизинг во владение из одного компонента в другой вашей системы. Например, первый компонент владеет лизингом на блобе, но нужно сделать так, чтобы второй компонент мог получать доступ к этому блобу. Второй компонент может использовать текущий ID лизинга первого компонента, поменять его на новый ID, выполнить необходимые операции, потом сменить ID лизинга на старый, что позволит второму компоненту временно получить эксклюзивный доступ на блоб, модифицировать его и передать эксклюзивный доступ обратно.

Ниже приведен код смены ID лизинга.

string newLeaseId = Guid.NewGuid().ToString();

blob.ChangeLease(
// новый ID лизинга
newLeaseId, 
// leaseId - ID, полученный от первого компонента 

AccessCondition.GenerateLeaseCondition(leaseId));

// переопределение длительности лизинга на период, нужный второму компоненту

// для выполнения своих операций

blob.AcquireLease(TimeSpan.FromSeconds(30), newLeaseId);

Перейдем к прерыванию лизинга. Эта операция используется для освобождения активного лизинга, знать же ID активного лизинга необязательно – до нововведений операция Break Lease позволяла додержать лизинг до момента окончания длительности лизинга, сейчас же это до сих пор так в стандартной ситуации, но можно также указать момент, когда лизинг будет прекращен. Момент-период прекращения лизинга может быть равен от 0 до 60 секунд.

// Если длительность лизинга указана как null, это значит, что лизинг будет активен

// всё оставшееся ему время 

blob.BreakLease(TimeSpan.FromSeconds(20)); 

В новой версии можно задавать лизинг, не ограниченный по времени, указав длительность лизинга как -1 либо null.

blob.AcquireLease(null /* бесконечный лизинг */, leaseId);

// Примечание: можно снова вызвать функцию получения лизинга,

// указав новое значение длительности лизинга

Лизинг для контейнера был добавлен в новой версии, при этом удерживание лизинга контейнера не предотвращает выполнения операций добавления, удаления или обновления блобов в контейнере другими клиентами, но защищает контейнер от удаления его самого. С лизингом контейнера можно выполнять те же операции, что и с лизингом блобов – получение лизинга, изменение лизинга, обновление, освобождение и прерывание.

Лизинг контейнеров можно использовать в ситуации миграции данных из одного контейнера в другой, позволяя выполнять процесс передачи данных одному клиенту, но не нескольким.

CloudBlobClient client = storageAccount.CreateCloudBlobClient();

// каждому клиенту(задаче) миграции назначается

// ID определенного экземпляра, который будет использоваться как ID лизинга

string leaseId = instanceId; 

IEnumerable<CloudBlobContainer> containerList = client.ListContainers();

foreach (CloudBlobContainer container in containerList)

{

try

{

container.AcquireLease(null /* Infinite lease */, leaseId);
// если ОК - запустить процесс миграции, который по завершению миграции

//удалит контейнер 

…

}

catch (Exception e)

{

// обработка исключений, связанных с лизингом

}

}

Каждый лизинг имеет собственный набор свойств, который возвращается при использовании функций List Containers, List Blobs, Get Container Properties, Get Blob Properties и Get Blob.

x-ms-lease-status (или LeaseStatus)

статус лизинга блоба или контейнера – locked/unlocked

x-ms-lease-state (или LeaseState)

состояние лизинга блоба или контейнера – available,leased,expired,breaking,broken

x-ms-lease-duration (или LeaseDuration)

тип лизинга – неограниченный либо ограниченный по времени

Что касается изменений в части Storage API, то они сведены в таблицу ниже.

Название функции

Назначение

Ссылка на MSDN

Copy Blob

Копирует блоб из одного контейнера блобов в другой в пределах одного аккаунта хранилища или во внешний

Тут

Lease Blob

Предоставляет эксклюзивный лок на блобе, ограничивая операции записи или удаления

Тут

Abort Copy Blob

Отменяет текущую операцию копирования блоба (Copy Blob), оставляя блоб в месте назначения с нулевой длиной и полный набором метаданных

Тут

Lease Container

Предоставляет эксклюзивный лок на контейнере блобов, ограничивая операции записи или удаления

Тут

Get Table ACL

Возвращает информацию о политиках доступа, определенных для таблицы и которые можно использовать для генерации токенов SAS

Тут

Set Table ACL

Определяет политики доступа для таблицы

Тут

Get Queue ACL

Возвращает информацию о политиках доступа, определенных для очереди и которые можно использовать для генерации токенов SAS

Тут

Set Queue ACL

Определяет политики доступа для очереди

Тут

Снижение цен

Особо комментировать нечего – произошло снижение цен за транзакции хранилища с $0.01 за 10.000 транзакция до $0.01 за 100.000 транзакций (на 90%).

Advertisements

Advertisements