このエントリは2020/03/31現在の情報に基づいています。将来の機能追加・変更に伴い、記載内容との乖離が発生する可能性があります。
以前Cosmos DB Java SDK v4のエントリを書いた。
Azure Cosmos DB Java v4 SDK (1)
https://logico-jp.io/2019/11/07/azure-cosmos-db-java-v4-sdk-1/
このエントリでは、v4 SDKをv3 SDKと比較していた。そうこうするうちに開発部門のブログで、Java v4 SDKが取り上げられるようになった(そして2020/06/10にGA)。具体的には以下。後者のエントリでは、AsyncとSyncでパフォーマンスの違いが出ることを説明している。
Azure Cosmos DB Java SDK v4 – New Java SDK Quickstart Guide and Sample Code!
https://devblogs.microsoft.com/cosmosdb/java-sdk-v4-1/
Azure Cosmos DB Java SDK v4 – Exploring the new Async API
https://devblogs.microsoft.com/cosmosdb/java-sdk-v4-async-vs-sync/
先ほどのエントリをこのエントリで単に日本語にするのも芸がないので、このエントリで紹介されているソースコードを使った同期API、非同期APIのパフォーマンス測定時の注意点を記しておく。
用意するもの
- VM
- テストクライアント用途。
- 今回はStandard DS2 v2を利用したが、CPUとネットワークがボトルネックにならなければOK。
- Cosmos DBアカウント
- SQL APIを使うように構成
- JDK
- JDK 8 (8u252)、11 (11.0.7)、14 (14.0.1)
- 今回はAzul Zuluを使用したが、特にどのベンダーのものでもOK。
- Java SDK v4
- Mavenで依存関係を指定するだけなので、事前のダウンロードは不要
- ソースコード
- 上記エントリで利用しているコードを使う。git cloneしておく
Sample code for Azure Cosmos DB Java SDK for SQL API
https://github.com/Azure-Samples/azure-cosmos-java-sql-api-samples
Database、Containerはテストアプリケーション内で作成している。指定スループットが小さい(400 RU/s)ため、ソースコード内でDatabase作成時のスループット指定箇所を変更しておくことが望ましい(スループットが小さいとHTTP 429のエラーが返り、パフォーマンス計測に支障がある)。
オブジェクト | 名称 | Partition Key | スループット |
---|---|---|---|
Database | ContosoInventoryDB | N/A | manualであれば100,000 RU/s もしくはAutoscale(旧Autopilot)で100,000 RU/s |
Container | ContosoInventoryContainer | /id | manualであれば100,000 RU/s Autoscale(旧Autopilot)の場合は指定不要 |
実行時には、環境変数として以下の2種類を指定する。
変数名 | 内容 |
---|---|
ACCOUNT_HOST | Cosmos DBのURI |
ACCOUNT_KEY | Cosmos DBの読み取り・書き込みキー |
ビルドして、以下の呼び出しで動作確認。なお、ビルド時にこの計測に不要なソースコードでコンパイルエラーが出る可能性がある。その場合は当該ソースコードをビルド対象から外すか、コメントアウトしておくこと。
# 同期
mvn exec:java -Dexec.mainClass="com.azure.cosmos.examples.requestthroughput.sync.SampleRequestThroughput" -DACCOUNT_HOST
=$ACCOUNT_HOST -DACCOUNT_KEY=$ACCOUNT_KEY
# 非同期
mvn exec:java -Dexec.mainClass="com.azure.cosmos.examples.requestthroughput.async.SampleRequestThroughputAsync" -DACCOUNT_HOST
=$ACCOUNT_HOST -DACCOUNT_KEY=$ACCOUNT_KEY
同期APIと非同期APIの違い
どれぐらいパフォーマンスに違いが出るのか、ちょっと比較してみた。同期APIに比べて非同期APIでは高速に処理が終わる(当然と言えば当然)。以下のグラフは同期型、非同期型での1秒ごとのスループットを比較したもの(JDK 8での測定)。同期APIでは低いスループット(途中0のことがほとんど)で長時間かけてデータ挿入しているが、非同期APIでは大きなスループットで短時間のうちに終了する。なお、この傾向はJDKのバージョンによる違いはない。
