原典:Azure: New DocumentDB NoSQL Service, New Search Service, New SQL AlwaysOn VM Template, and more
Azure:新しいDocumentDB NoSQL Service、新しい検索サービス、新しいSQL AlwaysOn VMテンプレートなど
今回、Microsoft Azureに大幅なアップデート一式をリリースしました。更新内容は以下のとおりです。
- DocumentDB:新しいNoSQL Document Serviceのプレビュー
- Search:新しいSearch-as-a-Serviceのプレビュー
- 仮想マシン:SQL Server AlwaysOnおよびコミュニティ主導のVMに対するポータルサポート
- Webサイト:プレビューポータルでWebジョブおよびWebサイトのプロセスサポート
- Azure Insights:Microsoft Azureモニタリングサービス管理ライブラリの一般公開
- API管理:REST APIのサポート
上記の新機能はすべて現在使用可能です(注:まだプレビューのものもあります)。以下はその詳細になります。
DocumentDB:新しいNoSQL Document Serviceの発表
新しいDocumentDBサービスのプレビューを発表でき非常にうれしく思います。NoSQLドキュメントデータベースサービスは、スケーラブルで高性能な最新アプリケーションのために設計されたものです。DocumentDBは、エンタープライズグレードのSLAが付いた完全に管理されたサービスとして提供されます(つまり、インフラストラクチャまたは仮想マシンを自分で管理する必要がありません)。
NoSQLストアとして、DocumentDBはまったくのスキーマフリーになっているため、スキーマに関係なくすべてのJSONドキュメントを格納および検索することができます。このサービスはビルドインの自動インデックスサポートを提供しています。つまり、ストアに対してJSONドキュメントを書くと、すぐになじみのあるドキュメント指向のSQLクエリ文法を使用して検索することができます。また、サーバーサイドJavaScriptで書かれたユーザー定義関数(UDF)のサービスサイド評価を行うために、オプションでクエリの文法を拡張することができます。
DocumentDBは、アプリケーションのニーズに合わせて直線的に拡張するように設計されています。DocumentDBサービスは、容量単位で購入でき、それぞれが高パフォーマンスのストレージと専用パフォーマンススループットを確保しています。容量の単位は、スケールのニーズに応じて、AzureポータルまたはRESTベースの管理APIを通じて簡単に追加したり削除することができます。これにより、容量の単位を増加または減少させるだけで、予測可能なパフォーマンスを保ち、アプリケーションのダウンタイムもなく、きめの細かい単位でデータベースを弾力的に拡張することができます。
昨年を通じて、いくつかの高プロファイルサービスに対して、Microsoftで内部的にDocumentDBを使用していました。現在、10ミリ秒以下の少ない遅延で予測可能なパフォーマンスを伴い、それぞれのサイズは数百TB、1日あたり数百万もの複雑なDocumentDBクエリを処理するDocumentDBデータベースがあります。DocumentDBは、このようなアプリケーションやソリューションを信じられないほどのサイズまで拡張できる素晴らしい方法を提供しています。
DocumentDBでは、特定のアプリケーションやシナリオに対するインデックスポリシーや整合性レベルをカスタマイズして、さらにパフォーマンスを調整することができるため、アプリケーションに対して非常に柔軟で強力なデータサービスになります。検索および読み込み操作に対して、DocumentDBには、Strong、Bounded Staleness、Session、Eventualという4つの整合性レベルがあります。これらの整合性レベルにより、整合性とパフォーマンスにおける調整が可能です。各整合性レベルは、アプリケーションで信頼性の高い結果が得られる予測可能なパフォーマンスレベルにより裏付けされています。
DocumentDBは、Webやモバイルアプリケーションからの利点が簡単に活用できるJSON、HTTP、RESTなどのユビキタスフォーマットで大きな賭けをしました。今回のリリースで、.NET、Node.js、JavaScript、Python SDKも配布しています。サービスは、RESTful HTTPインターフェースからアクセスしたり、Azureプレビューポータルから簡単に管理することも可能です。
DocumentDBアカウントのプロビジョニング
DocumentDBを開始するために、新しいデータベースアカウントを準備します。これを行うには、新しいAzureプレビューポータル(http://portal.azure.com)で、Azureギャラリーをクリックし、Data, storage, cache + backupカテゴリを選択して、DocumentDBのギャラリー項目を確認してください。
DocumentDB項目を選択し、Createコマンドを選択して作成ブレードを起動してください。
作成ブレードで、作成したいサービスの名前、拡張したいDocumentDBインスタンスを容量、展開したいロケーション(西米国Azure領域など)を指定してください。
準備が完了したら、Azureポータルダッシュボードの新しいインスタンスアイコンをクリックすると、DocumentDBアカウント管理を開始できます。
キータイルは、プログラムでDocumentDBサービスにアクセスするために使用するセキュリティキーの取得に使用することができます。
DocumentDBを使用した開発
DocumentDBに対するプログラミング方法は、多種多様にあります。HTTPS経由で直接REST APIを使用したり、.NET、Node.js、JavaScript、Python クライアントSDKから選択することもできます。今回の例に使用するJSONデータは、2つの家族に関する情報です。
// AndersonFamily.json file
{
"id": "AndersenFamily",
"lastName": "Andersen",
"parents": [
{ "firstName": "Thomas" },
{ "firstName": "Mary Kay" }
],
"children": [
{ "firstName": "John", "gender": "male", "grade": 7 }
],
"pets": [
{ "givenName": "Fluffy" }
],
"address": { "country": "USA", "state": "WA", "city": "Seattle" }
}
そして、
// WakefieldFamily.json file
{
"id": "WakefieldFamily",
"parents": [
{ "familyName": "Wakefield", "givenName": "Robin" },
{ "familyName": "Miller", "givenName": "Ben" }
],
"children": [
{
"familyName": "Wakefield",
"givenName": "Jesse",
"gender": "female",
"grade": 1
},
{
"familyName": "Miller",
"givenName": "Lisa",
"gender": "female",
"grade": 8
}
],
"pets": [
{ "givenName": "Goofy" },
{ "givenName": "Shadow" }
],
"address": { "country": "USA", "state": "NY", "county": "Manhattan", "city": "NY" }
}
Visual StudioでNuGetパッケージマネージャを使用すると、.NETアプリケーションにDocumentDB NETパッケージをダウンロードしてインストールすることができます。Azure管理ポータルから取得したDocumentDBサービスのURIと認証キーがあれば、準備したDocumentDBサービスに接続し、データベースを作成してコレクションを作成し、いくつかのJSONドキュメントを挿入し、それらをすぐに検索することができます。
using (client = new DocumentClient(new Uri(endpoint), authKey))
{
var database = new Database { Id = "ScottsDemoDB" };
database = await client.CreateDatabaseAsync(database);
var collection = new DocumentCollection { Id = "Families" };
collection = await client.CreateDocumentCollectionAsync(database.SelfLink, collection);
// DocumentDBは強く片付けされたPOCO、dynamicオブジェクトをサポート
supports strongly typed POCO objects and also dynamic objects
dynamic andersonFamily = JsonConvert.DeserializeObject(File.ReadAllText(@".\Data\AndersonFamily.json"));
dynamic wakefieldFamily = JsonConvert.DeserializeObject(File.ReadAllText(@".\Data\WakefieldFamily.json"));
// DocumentDBに文書を保存
await client.CreateDocumentAsync(collection.SelfLink, andersonFamily);
await client.CreateDocumentAsync(collection.SelfLink, wakefieldFamily);
// シンプルなWHERE句にマッチしたJSON文書を返すシンプルなクエリー
var query = client.CreateDocumentQuery(collection.SelfLink, "SELECT * FROM Families f WHERE f.id = 'AndersenFamily'");
var family = query.AsEnumerable().FirstOrDefault();
Console.WriteLine("The Anderson family have the following pets:");
foreach (var pet in family.pets)
{
Console.WriteLine(pet.givenName);
}
// 子供の性別が男とである家族の子供情報だけを取得
query = client.CreateDocumentQuery(collection.DocumentsLink, "SELECT * FROM c IN Families.children WHERE c.gender='male'");
var child = query.AsEnumerable().FirstOrDefault();
Console.WriteLine("The Andersons have a son named {0} in grade {1} ", child.firstName, child.grade);
// テストデータベースをクリーンアップ
await client.DeleteDatabaseAsync(database.SelfLink);
}
上記でお分かりのように、DocumentDBの.NET APIは.NET非同期パターンをサポートしているため、スケール調整したいアプリケーションでの使用には最適です。
サーバサイドJavaScriptストアドプロシージャ
トランザクション内で複数のドキュメントに影響をする更新をいくつか実行したい場合、家族間でペットを交換するJavaScriptを使用したストアドプロシージャを定義します。このシナリオでは、何か予期せぬことが発生して、1つの家族にすべてのペットが集まり、もう一つには何もないという結果にしないことが重要です。交換の処理中にエラーが発生した場合、データベースはトランザクションをロールバックし、すべてを整合性のある状態に保つことが重要になります。これを行うために次のストアドプロシージャを使用し、DocumentDBサービス内で実行します。
function SwapPets(family1Id, family2Id) {
var context = getContext();
var collection = context.getCollection();
var response = context.getResponse();
collection.queryDocuments(collection.getSelfLink(), 'SELECT * FROM Families f where f.id = "' + family1Id + '"', {},
function (err, documents, responseOptions) {
var family1 = documents[0];
collection.queryDocuments(collection.getSelfLink(), 'SELECT * FROM Families f where f.id = "' + family2Id + '"', {},
function (err2, documents2, responseOptions2) {
var family2 = documents2[0];
var itemSave = family1.pets;
family1.pets = family2.pets;
family2.pets = itemSave;
collection.replaceDocument(family1._self, family1,
function (err, docReplaced) {
collection.replaceDocument(family2._self, family2, {});
});
response.setBody(true);
});
});
}
レコードの更新中に同時実行違反により例外がJavaScript関数にスローされた場合、トランザクションは取り消され、システムは機能が開始される前の状態に戻されます。以下のようなコードでストアドプロシージャを登録するのは簡単です(例:展開スクリプトまたはアプリのスタートアップコード内で)。
// ストアドプロシージャを登録
StoredProcedure storedProcedure = new StoredProcedure
{
Id = "SwapPets",
Body = File.ReadAllText(@".\JS\SwapPets.js")
};
storedProcedure = await client.CreateStoredProcedureAsync(collection.SelfLink, storedProcedure);
アプリケーション内からストアドプロシージャを実行することも簡単です。
// 家族間でペットを入れ替えるストアドプロシージャを実行 dynamic result = await client.ExecuteStoredProcedureAsync<dynamic>(storedProcedure.SelfLink, "AndersenFamily", "WakefieldFamily");
Anderson家に属するペットを確認すると、ちゃんと入れ替わっていることが分かります。
その他の情報
DocumentDBを開始して、簡単な作業アプリケーションを作成するのは非常に簡単で数分できます。上記は、その開始方法を示した簡単な一つの例にすぎません。DocumentDBがスキーマレスであるため、文字通りあらゆるJSON形式のドキュメントでそれを使用することができます。その中に格納されたすべてのJSONドキュメントに自動インデックスを実行するので、後でそれらのJSONドキュメントを検索した時に素晴らしいパフォーマンスが得られます。一貫したパフォーマンスで直線的にスケール調整するので、規模が大きくなりそうなアプリケーションには理想的です。ここの新しいDocumentDB開発センターからDocumentDBについて詳細をご確認いただけます。

