Azure DocumentDBでChakraとJavaScriptを使用する

Andrew Liu (プログラムマネージャー、Azure DocumentDB)およびLimin Zhu (プログラムマネージャー、Chakra)の記事「 ChakraでAzure DocumentDBでJavaScriptを実行する 」の翻訳に注目してください。



Chakraは、Microsoft EdgeおよびユニバーサルWindowsアプリケーションで使用されるJavaScriptエンジンです。 Windows 8.1およびWindows Server 2012 R2から、Chakraは新しい埋め込みAPI( JavaScript RuntimeまたはJSRT API)のセットを導入しました。これにより、前述のクライアントスクリプトの範囲を超えてChakraを使用できます。







Azure DocumentDBは、組み込みのChakraを備えた最初のサービスの1つであり、データベースエンジンにスクリプト機能をネイティブに実装するために使用されました。 GitHubでChakraの主要コンポーネント( ChakraCore )が発見されたことを最近発表したことで、Chakraの将来の使用に関する経験と計画を共有できることを嬉しく思います。



NoSQLデータベースでJavaScriptを使用する



Azure DocumentDBは、書き込み用に最適化され、ドキュメントの操作に重点を置いたNoSQLデータベースサービスです。 このサービスはもともと、JSONとJavaScriptの操作をネイティブにサポートするように設計されました。 JavaScriptオブジェクト式から派生したJSONは、構造化データおよび部分構造化データを送信するときによく使用されます。



DocumentDBはChakraを使用して、データベースエンジン内でネイティブにJavScriptロジックをトランザクション実行するなど、サーバー側でプログラム可能な機能を実装します。 T-SQLの最新の代替としてJavaScriptを使用するアプローチは、開発者にDocumentDBのサーバー側スクリプト( ストアドプロシージャ、トリガー、およびユーザー定義関数 )の形式で表現されたビジネスロジックを実装するための自然なインターフェイスを提供するようです。



例として、DocumentDBでChakraがどのように使用されるかを理解するために、ストアドプロシージャを見てみましょう。 開発者は、JavaScriptで記述されたストアドプロシージャを登録および実行して、単一のACIDトランザクションを使用して、多数のドキュメントに対してバッチまたはシーケンシャルセットの操作を実行できます。 テナントがストアドプロシージャを登録すると、Chakraはそれをバイトコードにプリコンパイルします。



さらに、テナントがプロシージャの実行を開始すると、Chakraランタイムは既存のリソース制限を考慮して、サンドボックス内の対応するスクリプトを実行します。 ランタイムは、JavaScriptプログラミングモデルとデータベースの状態の分離されたスナップショットとの緊密な統合を実装します。 ストアドプロシージャが成功するまで、データベース内のすべての操作は単一のトランザクションの一部として実装されます。 スクリプトで例外が発生した場合、DocumentDBはトランザクション全体を自動的にロールバックします。







Chakra機能のいくつかと、DocumentDBでの使用について詳しく見てみましょう。



ストリームレンタル



Chakraは、JavaScriptランタイムが常に単一のスレッドで実行されるスレッドレンタルモデルを実装しますが、特定のスレッドに関連付けられていません。 つまり、ランタイムは常に1つのスレッドで動作しますが、特定のスレッドへのバインディングは時間とともに変化する可能性があります。



リーススレッドは、一連のランタイム環境を管理し、JavaScriptを実行する各テナントに環境を割り当てることができるため、DocumentDBに適しています。 これにより、DocumentDBは各テナントのセキュリティと分離を維持しながら、テナントごとに新しいランタイムを不必要に初期化するコストを回避できます。



バイトコードのシリアル化



サーバー側のスクリプトを登録した後、DocumentDBはChakraを使用してスクリプトをプリコンパイルし、バイトコードにシリアル化します。 通常のJavaScript実行チェーンでは、エンジンは実行前にコードを解析し、構文ツリーを作成し、バイトコードを生成する必要があります。 Chakraのバイトコードのシリアル化により、DocumentDBはバイトコードを生成する前にスクリプトを前処理し、後で再利用できるようにキャッシュされたコピーを保存できます。 これにより、各実行前にコードを再分析する手間が省け、実行速度が大幅に向上します。



リソース管理API



DocumentDBはマルチテナントサービスとして設計されており、「侵入的な近隣問題」を防ぐために、厳密なリソース管理とテナントの分離が重要です。 統合コンポーネントは、非常に限られたシステムリソースのフレームワーク内でアクティビティを実装し、DocumentDBの共通リソース管理およびテナント分離システムに統合する必要があります。



テナントのスクリプトの1つが追加のリソースを消費することを許可すると、すべてのテナントのパフォーマンスに影響を与えたり、サービス全体の動作を中断したりする可能性があります。 Chakraは、DocumentDBがこの問題を解決するために使用するAPIを公開し、CPUまたはメモリの消費が範囲外の場合、データベースがスクリプトの実行を中断できるようにします。



ChakraCoreへの移行



ご存じのとおり、Chakraチームは最近、 ChakraCoreプロジェクトの一環としてエンジンの主要コンポーネントを発見しました。 ChakraCoreはChakraとほぼ同じ機能を実装し、自己完結型のJavaScriptエンジンとして設計されており、オープンでさらに開発されます。 DocumentDB側には、近い将来ChachaからChakraCoreに移行する計画がすでに含まれています。 このステップにより、上記の機能を維持しながら、ユーザーに追加のメリットを提供できます。 また、エンジンの開発に貢献する予定です。



ECMAScript 6の機能



過去1年は、おそらく史上最も重要なJavaScriptアップデートであるECMAScript 6標準(ES6、または正式にはES2015)が最終的に採用されたことを考えると、JavaScriptコミュニティにとって特に注目に値します。 ES6に実装されているさまざまな新機能と構文バンは、コミュニティから大きな評価を受けています。



ChakraCoreはすでにES6の多くの機能を実装しています。 DocumentDBを新しいエンジンに移行すると、開発者はデータベースを操作するためにさらに便利なJavaScriptコードを使用できるようになります。たとえば、ES6 Promiseを使用してデータ処理を簡素化できます。 ES6のプロミスと矢印関数を使用するストアドプロシージャの例を次に示します。



function swapPlayerInventories(playerId1, playerId2) { __.filter(document => {return document.id == playerId1 || document.id == playerId2;}) .then(playersToSwap => { var player1 = playersToSwap[0], player2 = playersToSwap[1]; var player1ItemTemp = player1.item; player1.item = player2.item; player2.item = player1ItemTemp; return __.replaceDocument(player1); }) .then(() => __.replaceDocument(player2)) .catch(error => { throw 'Unable to update players, rollback transaction.';} ); }
      
      







そして、もう少し言葉



Chakraの使用は私たちにとって大きな成功でした。ChakraCoreへの移行により、サービスをさらに発展させることを楽しみにしています。 埋め込みwikiは、ChakraCoreをアプリケーションに統合する方法を学ぶための良い出発点です。



Chakraチームへのフィードバックがある場合は、GitHubでリクエストを開くか、Twitter @ChakraCoreで リクエストを送信できます。



サーバー側のDocumentDBプログラミングモデルの詳細については、 ドキュメントのページをご覧ください。 DocumentDBについて質問がある場合は、 StackOverflowフォーラムでお問い合わせいただくか、DocumentDBエンジニアリングチームと1対1のチャットスケジュールしてください。 @DocumentDB twitterで、新機能の最新ニュースや発表をフォローできます



All Articles