CosmosDBの「書き込み操作のレスポンスコンテンツ応答無効」オプションについて

Azure

Azure公式ドキュメントには、.NET SDKを利用してCosmosDBにアクセスする際のパフォーマンスに関するヒントが記載されています。今回は、その中で「書き込み操作に対するコンテンツ応答を無効にする」を試してみました。

結論

「EnableContentResponseOnWrite = false」というオプションを書き込みする際に渡すことで、作成・更新されたリソースが返却されなくなります。具体的には以下の2つの変化が見られました。

  • 書き込み操作のレスポンス(Itemresponse)のResourceプロパティがnullになる
  • CosmosDBのログ(CDBDataPlaneRequests)のResponseLenghtが0になる

動作確認

コンテンツ応答有効のパターン

まずは、オプションなし、つまりコンテンツ応答有効の状態で書き込んでみます。

var id = DateTime.Now.ToString("yyyyMMdd-HHmmssffff");
var name = "test1";
var cosmosData = new CosmosEntity(id, name);

try
{
    var con = this._cosmosClient.GetContainer(containerName, colletionName);
    //Create new item
    var createResult = await con.CreateItemAsync<CosmosEntity>(cosmosData);
 }

ちなみに書き込むデータは以下のようなjsonです。やや適当ですが、サイズがある程度大きくなるようにcodeEntityプロパティにリスト形式でデータを持たせています。

{
    "id": "20230719-1125299149",
    "name": "test1",
    "codeEntity": [
        {
            "alphaAndNumber": "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
            "hiragana": "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽっゃゅょ"
        },
       ・・・(省略)・・・
        {
            "alphaAndNumber": "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
            "hiragana": "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽっゃゅょ"
        }
    ]
}

コンテンツ応答無効のパターン

続いては、コンテンツ応答を無効にして実行します。以下のように「EnableContentResponseOnWrite = false」をCreateitemAsyncに渡します。

var id = DateTime.Now.ToString("yyyyMMdd-HHmmssffff");
var name = "test1";
var cosmosData = new CosmosEntity(id, name);

try
{
    var con = this._cosmosClient.GetContainer(containerName, colletionName);
    //Create new item
    ItemRequestOptions requestOptions = new ItemRequestOptions() { EnableContentResponseOnWrite = false };
    var createResult = await con.CreateItemAsync<CosmosEntity>(cosmosData, requestOptions: requestOptions);
}

結果の確認と比較

では、何がどのように変わったのでしょうか。結果を比較してみます。

まずは、デバッグしてレスポンスを見てみましょう。左側がコンテンツ応答有効で右側が無効のレスポンスです。有効ですと、Resourceに作成したデータがそのまま格納されています。一方、無効にすることでResourceがnullになっていることが分かります。また無効にしてもRequestChargeやヘッダーは問題なく返却されます。

続いて、CosmosDBのログからレスポンスのサイズ(ResponseLength)を見てみましょう。コンテンツ応答が有効の場合はレスポンスが3500バイトでしたが、無効にすることでが0になっています。このレスポンスがデバッグで確認したResourceプロパティに相当するようです。

まとめ

CosmosDBにCreateやUpdateをする際は、「EnableContentResponseOnWrite = false」にすることで、ネットワークを流れるデータ量を削減できます。CreateやUpdateしたデータ自体はアプリ側で持っているため、わざわざCosmosDBから返却してもらう必要はありません。非常に大きなデータを扱う場合や大量のCreateやUpdateリクエストを行う場合は無効にするとパフォーマンスが向上するかもしれません。

また公式ドキュメントによると、SDKがメモリを割り当てたり、応答の本文をシリアル化したりする必要がなくなるため、パフォーマンスが向上するとのことです。

ちなみに、読み取りの際に「EnableContentResponseOnWrite = false」を設定しても、問題なくレスポンスは返却されます。「OnWrite」とあるように、書き込みの際に適用されるオプションのようです。

参考文献

    コメント