サーバーサイド JavaScript で Azure DocumentDB のアプリケーションのパフォーマンスを大幅に向上

このポストは、4 月 23 日に投稿された Boost Your Application’s Performance with Server-Side JavaScript in Azure DocumentDB の翻訳です。

JavaScript を最新の T-SQL として統合

Azure DocumentDB のデータベース エンジン内で JavaScript ロジックのトランザクションをネイティブに実行できることはご存知でしょうか? JavaScript を最新の T-SQL として使用すると、機能豊富で使い慣れたインターフェイスをビジネス ロジックに実装することができます。ロジックはストアド プロシージャトリガーユーザー定義関数 (UDF) の形で記述することができます。今回は DocumentDB がストアド プロシージャをどのように解釈するかについて説明します。

パフォーマンスの高いバッチ処理とシーケンス処理

ストアド プロシージャの大きなメリットは、複雑なバッチ処理やシーケンス処理を、データの格納場所に近いデータベース エンジン内で直接実行できることです。ストアド プロシージャでは、挿入、更新、削除などの処理をグループ化およびシーケンス化し、まとめて実行します。このため、バッチ処理やシーケンス処理でのネットワーク トラフィックの遅延コストを完全に削減できます。

 

一連のデータベース処理を実行する場合

 

ストアド プロシージャで一連の処理を実行する場合

また、ストアド プロシージャの登録時に暗黙的にバイト コード形式にプリコンパイルされるため、呼び出すたびにスクリプトをコンパイルする必要がないというメリットもあります。JSON は Javascript 言語形式のシステムに属し、DocumentDB のストレージの基本単位であるため、JSON ドキュメントをバッファー プール内で遅延実体化しオンデマンドで実行コードを使用できるようにするなど、内部でさらに最適化できます。このため、ストアド プロシージャを呼び出すことで処理が速くなり、メモリ使用量も低く抑えられます。

複数ドキュメントのトランザクション

DocumentDB では、単一のストアド プロシージャを構成するすべての処理で ACID (Atomicity: 原子性、Consistency: 整合性、Isolation: 独立性、Durability: 耐久性) が完全に保証されています。このため、ストアド プロシージャを使用すると、アプリケーションが関連する処理を 1 つのバッチに組み込むことができます。この場合、実行される処理はすべて成功するか、すべて失敗するかのいずれかとなります。ほとんどの NoSQL データベースでは、複数ドキュメントおよび複数レコードの ACID 処理を実行することはできません。

トランザクションのコミットやロールバックも簡単で、ストアド プロシージャで実行されるすべての処理は自動的に 1 つのトランザクションにラップされます。例外が 1 つも発生せずに JavaScript が完了すると、処理がデータベースにコミットされます。スクリプト内で何らかの例外が発生した場合、実行中の JavaScript でトランザクション全体が自動的にロールバックされます。例外のスローは、実際には DocumentDB の “ROLLBACK TRANSACTION” と同等です。

ストアド プロシージャには実行制限があるため、サーバーで指定されている要求のタイムアウト時間内にすべての処理が完了する必要があります。制限時間内に処理が完了しない場合、トランザクションは自動的にロールバックされます。時間制限への対応を簡略化するために、CRUD 処理 (create: 作成、read: 読み込み、update: 更新、delete: 削除) (英語) では処理が完了するかどうかを表すブール値を返します。このブール値は、処理をまとめて実行するための信号として使用され、処理を継続するように実装することも可能です (詳細については下記のコード サンプルを参照)。

ビデオ チュートリアル、コード サンプル、その他の資料

ストアド プロシージャの作成と実行に関する 5 分ほどのビデオを Channel 9 で公開 (英語) していますので、ぜひご覧ください。

Azure のデモ: Azure DocumentDB のサーバーサイド Javascript の簡単な紹介

 

この他にも、Github リポジトリ (英語) では upsert (英語)bulkDelete (英語)update (英語)bulkImport (英語) など、各種の新しいストアド プロシージャのサンプルを公開しています。

作成したストアド プロシージャを共有する場合は、プルリクエストを送信してください。Github (英語)Twitter (英語) で公開させていただきます。

DocumentDB の利用開始やその他の詳細情報については、こちらの Web サイトをご覧ください。また、DocumentDB のサーバーサイド プログラミング モデルの詳細情報については、こちらのドキュメントを参照してください。