背景
CosmosDBは1秒間に利用できるRU(リクエストユニット)は任意の値をユーザーで定義できるため、CosmosDBが消費できるRUの値を大きくすればどんなクエリも安定的に処理できる。しかし、なるべく多くのコマンドを少ないコストで捌きたい場合、自分が要求するコマンドによってどの程度のRUが消費されるかを知り、コマンドに対してRUの消費量が大きければコマンド内容を調整してなるべく少ないRUで同一の結果が得られるように対処しなければならない。ここではnode.jsを採用したプロジェクトにおいてCosmosDBへ要求したコマンドがどの程度RUを消費したのかを調査する方法を示す。
Node環境下でRUの消費量を知るには
CosmosDBに対してgetLastRequestStatisticsと呼ばれるCosmosDBにだけ利用できるカスタムコマンドを呼び出すことでRUの消費量を知ることができる。Nodeを使用している環境でgetLastRequestStatisticsコマンドを呼び出すにはdbオブジェクトのcommandメソッドを使用すればよい。具体的なコードを以下に示す。
const mongodb = require("mongodb")
const mongoClient = require("mongodb").MongoClient;
const connectstring = "CosmosDB接続文字列"
const dbname = "データベース名"
async function getLastRequestStatistics() {
const client = await mongoClient.connect(connectstring,{useUnifiedTopology: true})
const db = client.db(dbname)
//計測したいコマンドを記述する。以下は全件検索をするコマンドの例。
try {
const testcursor = db.collection("コレクション名").find({})
await testcursor.forEach((doc)=>{
//console.log(doc)
})
} catch(error) {
console.log(error)
}
//直前に実行したコマンドのRU消費量を知るためにgetLastRequestStatisticsコマンドを実行する
const result = await db.command({ getLastRequestStatistics: 1 })
console.log(`result:${result['CommandName']}`)
console.log(`requestCharge:${result['RequestCharge']}`)
await client.close()
}
getLastRequestStatistics().catch((reason)=>{console.log(reason)})
上記のように計測したいコマンドの実行、getLastRequestStatisticsコマンドの順でコマンドを実行することで特定のコマンドのRU消費量をしることができる。CosmosDBを利用する場合、本番環境で想定外のRUを消費しないために事前に自分のコマンドがどの程度のRUを消費するのかを一つ一つ確認することをおすすめする。
参考ページ