Microsoft DocumentDB: стаття друга, ресурси і концепції

Як вже було сказано в першій статті, DocumentDB виставляє доступ до своєї функціональності у вигляді програмної моделі RESTful, і сутності, що зберігаються всередині бази, називаються ресурсами, і адресуються за URI. Для доступу до цих ресурсів можна використовувати стандартні HTTP verbs, хэдеры і коди статусів.
Поки ми готуємо придатний приклад про DocumentDB (справа нешвидка і вдумливе) та відповіді на ваші запитання до першої частини статті, пропонуємо почитати трохи докладніше про ресурси та концепції, на яких працює DocumentDB.




Ресурсна модель DocumentDB складається з набору ресурсів, що зберігаються в певній структурі всередині облікового запису, і кожен з них доступний по постійному URI. Отже, все починається з аккаунта DocumentDB. Аккаунт — логічний контейнер, в якому зберігаються бази, кожна з яких містить колекції, які, в свою чергу, містять збережені процедури, тригери, UDF та ін. У кожної бази є користувачі, що мають набір прав на маніпуляції з документами. Дозволи видаються у вигляді токенів, колекції — це контейнери JSON-документів та логіки на JS.

Системні ресурси — облікові записи, бази, колекції, користувачі, збережені процедури, тригери і UDF — мають фіксовану схему, документи і атачменти ж обмежень на схему не мають і, відповідно, називаються призначеними для користувача ресурсами. Ресурси обох типів описуються JSON.



Кожен аккаунт, яких може бути багато усередині однієї підписки Azure, це збірний контейнер, що складається з одиниць, які об'єднують в собі SSD-сховище і зафіксований показник пропускної здатності. Юніти можна додавати або прибирати. Створити і змінювати налаштування облікового запису можна на порталі керування Microsoft Azure — portal.azure.com/ — або з допомогою REST API (добра частина функціональності платформи виставлена для управління REST API).
Якщо аккаунт — логічний контейнер вищого рівня, то база даних — це контейнер для колекцій і користувач. Всередині облікового запису може бути скільки завгодно баз даних.



В базі можна зберігати стільки даних, скільки необхідно — від декількох гігабайт до петабайт — і все це сховище буде працювати на SSD з фіксованою пропускною здатністю. Проте база даних не зафіксована в межах якоїсь однієї машини — це може бути велика база, в якій зберігаються тисячі колекцій і терабайти документів.

Колекція — контейнер наступного рівня вкладеності, вже для документів JSON. Колекція як контейнер служить не тільки для об'єднання, але і як юніт масштабування — транзакцій і запитів. Найпростіший спосіб масштабування — додати більше колекцій і розподілити по них SSD-сховище. Автоматичне ж масштабування вже працює — колекція автоматично змінює свій розмір за додавання або видалення документів. Поки DocumentDB в превью і має тільки один режим роботи (Standard Preview), максимальний розмір, до якого можна масштабуватися колекції, дорівнює 10 Гб.

Автоматична індексація



DocumentDB взагалі не вимагає від вас планування схеми для системи. Документи не передбачають наявності і, як тільки ви додаєте їх у колекцію, DocumentDB автоматично індексує їх (=> можна виконувати запити). Автоматичне індексування документів без необхідності думати про схему і вторинних індекси — це одна з головних фішок DocumentDB. При цьому забезпечується стабільно-стійке кількість дуже швидких операцій запису при послідовних запитах.
Автоматичну індексацію можна трохи правити, вибираючи політику індексації і, таким чином, виграючи на продуктивності і сховище. Можна або взагалі відключити автоматичну індексацію, або вибрати тільки деякі документи, які будуть індексуватися (і вибрати, які НЕ будуть індексуватися) та вибрати між синхронним (consistent) і асинхронним (lazy) режимами (за замовчуванням індекс оновлюється синхронним чином на кожній операції Insert, Replace або Delete, це поведінка можна підкоригувати на «ледачий» режим і, можливо, отримати якусь вигоду в продуктивності при, наприклад, колекції з великою кількістю операцій читання).

Мультидокументные транзакції



У RDBMS зазвичай пишуть бізнес-логіку з використанням збережених процедур і тригерів, запускаючи у вигляді транзакції, що накладає на розробника необхідність знання двох різних мов розробки — мови розробки проекту програми (PHP, Python, ін) і T-SQL. У DocumentDB доступна програмна модель виконання JS для колекцій у вигляді збережених процедур і тригерів, що дозволяє виконувати ефективний контроль паралелізму, індексування і не відволікатися на велику кількість прикладних засобів.
DocumentDB самостійно обертає цю логіку в Ambient ACID транзакцію з snapshot isolation і, якщо в процесі JS викидає виключення, то вся транзакція відкочується. Виконання JS проходить всередині движка в тому ж адресному просторі, що і Buffer Pool, що добре позначається на продуктивності.

function businessLogic(name, author) {
var context = getContext();
var collectionManager = context.getCollection(); 
var collectionLink = collectionManager.getSelfLink()
// створюємо документ.
collectionManager.createDocument(collectionLink,
{id: name, author: author},
function(err, documentCreated) {
if(err) throw new Error(err.message);
// фільтруємо документи по автору
var filterQuery = "SELECT * from root r WHERE r.author = 'George R.'";
collectionManager.queryDocuments(collectionLink,
filterQuery,
function(err, matchingDocuments) {
if(err) throw new Error(err.message);
context.getResponse().setBody(matchingDocuments.length);
// замінюємо автора
for (var i = 0; i < matchingDocuments.length; i++) {
matchingDocuments[i].author = "George R. R. Martin";
// we don't need to execute a callback because they are in parallel
collectionManager.replaceDocument(matchingDocuments[i]._self,
matchingDocuments[i]); 
}
})
})
};

Все це успішно загортається в транзакційних виконання через HTTP POST.

client.createStoredProcedureAsync(collection._self, {id: "CRUDProc", body: businessLogic})
.then(function(createdStoredProcedure) {
return client.executeStoredProcedureAsync(createdStoredProcedure.resource._self,
"NoSQL Distilled",
"Martin Fowler");
})
.then(function(result) {
console.log(result);
},
function(error) {
console.log(error);
});


JSON і JS наш герой розуміє з коробки, тому ніяких проблем з типами не відбувається. Докладніше — Azure DocumentDB REST APIs.

Збережені процедури, тригери і UDF



Як вже було сказано, бізнес-логіка може бути написана повністю на JS у вигляді збереженої процедури, тригера або UDF. Додаток на JS можна зареєструвати на виконання для тригерів, збережених процедур і UDF, тригери і збережені процедури вміють CRUD, тоді як UDF не мають доступу на запис, і дозвіл тільки на добуток простих операцій, наприклад, перерахувань та створення нового набору результатів на основі попередньої операції. Кожна процедура, тригер і UDF при цьому використовують фіксовану кількість ресурсів, при цьому не будучи здатними звертатися до зовнішніх бібліотек JS. При перевищенні виділених ресурсів операції блокуються.

Зареєструвати на виконання процедуру, тригер і UDF можна з допомогою REST API, і після реєстрації збережена процедура, тригер або UDF попередньо створюються і зберігаються як байт-код, який запускається на виконання.

Реєстрація збережених процедур



Реєстрація збереженої процедури = створення ресурсу для нової процедури і призначення її колекції з HTTP POST.

var storedProc = {
id: "validateAndCreate",
body: function (documentToCreate) {
documentToCreate.id = documentToCreate.id.toUpperCase();
var collectionManager = getContext().getCollection();
collectionManager.createDocument(collectionManager.getSelfLink(),
documentToCreate,
function(err, documentCreated) {
if(err) throw new Error('Error while creating document: ' + err.message;
getContext().getResponse().setBody('success - created ' + 
documentCreated.name);
});
}
};
client.createStoredProcedureAsync(collection._self, storedProc)
.then(function (createdStoredProcedure) {
console.log("Successfully created stored procedure");
}, function(error) {
console.log("Error");
});



Виконання збереженої процедури



Виконання збереженої процедури робиться знову ж таки з HTTP POST з передачею потрібних параметрів в тілі запиту.

var inputDocument = {id : "document1", author: "G. G. Marquez"};
client.executeStoredProcedureAsync(createdStoredProcedure.resource._self, inputDocument)
.then(function(executionResult) {
assert.equal(executionResult, "success - created DOCUMENT1");
}, function(error) {
console.log("Error");
});


Реєстрація тригерів



Реєстрація тригера = створення нового ресурсу для колекції з HTTP POST, і в процесі можна вказати, чи тригер викликатися до або після і тип виконуваної операції (CRUD).

var preTrigger = {
id: "upperCaseId",
body: function() {
var item = getContext().getRequest().getBody();
item.id = item.id.toUpperCase();
getContext().getRequest().setBody(item);
},
triggerType: TriggerType.Pre,
triggerOperation: TriggerOperation.All
}
client.createTriggerAsync(collection._self, preTrigger)
.then(function (createdPreTrigger) {
console.log("Successfully created trigger");
}, function(error) {
console.log("Error");
});


Прибрати реєстрацію тригера можна, виконавши HTTP DELETE на ресурс тригера.

client.deleteTriggerAsync(createdPreTrigger._self);
.then(function(response) {
return;
}, function(error) {
console.log("Error");
});


Атачменти



У DocumentDB можна зберігати двійкові файли (блобы), які виглядають як спеціальні сутності — атачменти. Аттачмент — це спеціальний документ (JSON), який посилається на реальний файл. Наприклад:
Вміст якоїсь книги лежить у сховищі DocumentDB або будь-якому іншому.
Додаток може зберігати метадані кожного користувача у вигляді окремого документа — наприклад, Alex для book1 буде доступний за посиланням /colls/alex/docs/book1.
Атачменти вказує на сторінки книги, тобто /colls/alex/docs/book1/chapter1, chapter2 і т.д.

Резюме



У цій вступній статті ми розглянули зовсім базові принципи і концепції DocumentDB. Новий сервіс, тому ми самі його активно вивчаємо і сподіваємося, що скоро ми зможемо уявити який-небудь гарний приклад використання. Залишайтеся на зв'язку :)

Корисні посилання



Спробувати Azure безкоштовно на 30 днів!
Вивчити курси віртуальної академії Microsoft по хмарних та іншим технологіям
Завантажити безкоштовну або пробну Visual Studio
Центр розробки Microsoft Azure (azurehub.ru) — сценарії, керівництва, приклади, рекомендації з вибору сервісів і розробці
Twitter.com/windowsazure_ru — останні новини Microsoft Azure
Співтоваристві Microsoft Azure на Facebook — експерти, питання
Стати розробником універсальних додатків Windows

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.