2017-02-11 43 views
1

我正在使用Azure函數應用程序使用documentDB。我在JS中創建了一個基本的HTTPtrigger,用於在documentDB中存儲(插入)條目。DocumentDB使用Azure函數應用程序緩慢寫入性能

收集的數據吞吐量設置爲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);}; 

對於每一個請求(POST)的功能的應用程序,它需要AVG各地30-40s執行和值存儲在集合,這是很長的。它會導致並行請求的連接超時。

  • 是否有任何性能調整可以用於documentDB或Azure函數應用程序來降低執行時間?

  • Function App如何在後臺處理documentDB?它是利用最佳做法嗎?

我熟悉其他NoSQL中的批量插入/更新操作,但找不到documentDB的任何內容。

回答

1

我們的輸出綁定枚舉了您給我們的文檔數組,並逐個插入文檔。對於大多數情況來說這很好,但是如果您有高級的批量導入要求可能不適合您。

DocumentDB客戶端API一般不支持批量插入操作,但可以通過編寫服務器端存儲過程(例如here)逐個完成這些操作。雖然Azure函數通常不能使用該存儲過程方法,但如果您需要自己使用DocumentDB客戶端SDK來執行此操作。

你可能會探索的另一個選擇是在你的http函數中輸入初始數組並將其分解爲更小的文檔組,並將它們推送到導入的Azure隊列中(使用我們的隊列綁定文檔here)。然後,您可以擁有一個監視該隊列的單獨函數,並使用上述輸出綁定來導入這些較小的文檔集。該隊列還可以讓您擴展 - 多個文檔集將導入並行

+0

如何使用功能應用程序的Azure存儲隊列服務? 另外,是否有任何基準或限制的併發documentDB寫操作? – Vish

+0

我建議使用上面的隊列綁定 - 請參閱鏈接。我們只是DocumentDB客戶端SDK的一個薄層,因此就潛在的併發限制而言,您應該看到DocumentDB文檔。 – mathewc

+0

關於Azure隊列綁定,我計劃使用Service Bus隊列綁定,它會起作用嗎? 我有一個1 MB大小的數組和文件說消息大小應該是256 KB,你提到將數組分割成多個文檔,但是在輸出中是否需要多個函數?因爲我認爲函數在context.done上觸發輸出 – Vish