2017-02-11 10 views
1

Azure関数AppでdocumentDBを使用しています。私はJS内に基本的なHTTPtriggerを作成して、documentDBにエントリを格納(挿入)しました。Azure関数appでのDocumentDBの遅い書き込みパフォーマンス

収集のデータスループットは2500(RU)に設定されています。

ここでreq.bodyは配列で、req.body.lengthは約2500個のオブジェクトで、1 MBのサイズになりますが、これはかなり小さいと思います。

module.exports = function (context, req) { 
context.bindings.document = []; 
if (req.body) { 
    //if(req.body instanceof Array){context.log("It is an array");} 
    context.bindings.document = req.body; // here document is function app parameter 
    res = {status: 200}; 
} 
else { 
    res = { 
     status: 400, 
     body: "Pass Parameters" 
    }; 
} 
context.done(null, res);}; 

function appへのリクエスト(POST)ごとに、実際にはコレクションに値を格納して実行するのに30-40秒ほどかかります。また、並列要求の接続タイムアウトが発生します。

  • 実行時間を短縮するためにdocumentDBまたはAzure関数アプリで使用できるパフォーマンス調整はありますか?

  • Function AppはdocumentDBをバックグラウンドでどのように処理しますか?ベストプラクティスを活用していますか?

他のNoSQLの一括挿入/更新操作には慣れていますが、documentDBには何も見つかりませんでした。

答えて

1

私たちの出力バインディングは、あなたが私たちに与えたドキュメント配列を列挙していて、を1つずつ入れます。。ほとんどの場合は問題ありませんが、バルクインポートの高度な処理が必要な場合は、それはあなたのためにはうまくいかないかもしれません。

DocumentDBクライアントAPIは一般的に一括挿入操作をサポートしていませんが、サーバ側のストアドプロシージャ(例:here)を記述することで大文字挿入操作を行うことができます。 Azure関数は一般的にそのストアドプロシージャのアプローチを使用できませんが、必要な場合は、DocumentDBクライアントSDKを使用してそれを行うことができます。

もう1つの方法として、http関数の最初の配列入力を取得して小さな文書グループに分割し、それらをAzureキューにインポートする(キューバインディングのドキュメントhereを使用)。そのキューを監視している個別の関数を用意し、上記のように出力バインディングを使用して、これらの小さな文書セットをインポートすることができます。キューは、スケールアウトも行います。に複数のドキュメントセットをインポートします。

+0

機能アプリでAzure Storageキューサービスを使用する方法はありますか? また、同時のdocumentDB書き込み操作にベンチマークや制限はありますか? – Vish

+0

上記のキューバインディングを使用することをお勧めします。われわれはDocumentDBクライアントSDK上の単なる薄いレイヤーなので、潜在的な並行性の限界がある限り、DocumentDBのドキュメントを参照する必要があります。 – mathewc

+0

Azureキューバインディングについて、サービスバスキューバインディングを使用する予定です。動作しますか? 1 MBの配列があり、メッセージサイズが256 KBであると書類が複数のドキュメントに分割されていると述べましたが、出力に複数の機能が必要ですか?私は関数がcontext.doneで出力をトリガすると思う – Vish

関連する問題