Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Azure:新しいDocumentDB NoSQL Service、新しい検索サービス、新しいSQL AlwaysOn VMテンプレートなど

連載:ScottGu's Blog翻訳

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2014/09/03 14:00

 本稿は、Scott Guthrie氏のブログを、氏の許可を得て、翻訳、転載したものです。米Microsoft社の副社長で、ASP.NETやSilverlightの開発チームを統率する氏のブログでは、次期製品を含む最新の技術をいち早く紹介しています。

目次

 原典: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について詳細をご確認いただけます。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト Chica(チカ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

バックナンバー

連載:Scott Guthrie氏 Blog翻訳

もっと読む

All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5