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