Azure CosmosDBとFunctionsのbind & multi insert
速度もデータ量も要求されている時にはAzure Cosmos DBを使いたい。
FunctionsとCosmosDBの統合は公式にサポートされているのでいい感じにサーバーレスな仕組みが作れるかと思った。 が、ドキュメントを見ると1件ずつしかinsertできない。
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-cosmosdb
やりたいのは↑のサンプルみたいにHTTPトリガーで1件ずつのinsertじゃなくてIoTHubとかEventHubとかと統合して大量データを一気に保存すること。
SDK見てみると、どうやらmulti insertは無いらしい..
Stream Analyticsを使うとできそうだけど、今回はCosmosDBのストアドプロシージャも試してみた。
ストアドプロシージャのコードはほぼ以下の通り、
https://stackoverflow.com/questions/28769507/azure-documentdb-bulk-insert-using-stored-procedure
getContext()
からCollection, Request, Responseのオブジェクトを取得して処理を行う。
http://azure.github.io/azure-documentdb-js-server/index.html
クライアント側はこんな感じのコードをFunctionsに書いてやればよい。
const DocumentClient = require('documentdb').DocumentClient // このリンクのルールを理解するまではこのSDKで何も出来ない… const sprocLink = `dbs/${dbId}/colls/${collectionId}/sprocs/${spId}` const client = new DocumentClient(host, {masterKey: masterKey}) // Arrayをいれるとエラーになったので対策 const sendData = { docs: [] } client.executeStoredProcedure(sprocLink, sendData, (err, res) => { context.log(err, res) context.done() })