これは2019/08/21現在の情報を基にしたものです。将来の機能追加や廃止に伴って記載内容との乖離が発生する可能性があります。
Cosmos DBのSDKを使ってマルチマスタを構成する方法は以下のドキュメントに記載がある。
Azure Cosmos DB を使用するアプリケーションでマルチマスターを構成する / Configure multi-master in your applications that use Azure Cosmos DB
https://docs.microsoft.com/azure/cosmos-db/how-to-multi-master
ただ、2019/08/21時点において、Java SDKを使った例は、v2のAsync Java SDK(CompletableFutureを使った実装)についてのみ紹介されており、SDK v3のReactorを使った実装を基にした記述にはなっていない。そのため、V3の場合の例を以下にまとめておく(当然、将来ドキュメントの記載が変更されるはず)。
v2の場合
v2の場合、以下のようにConnectionPolicyのプロパティを設定することで、マルチマスタ構成を設定していた。
ConnectionPolicy policy = new ConnectionPolicy();
policy.setUsingMultipleWriteLocations(true);
policy.setPreferredLocations(Collections.singletonList(region));
AsyncDocumentClient client =
new AsyncDocumentClient.Builder()
.withMasterKeyOrResourceToken(this.accountKey)
.withServiceEndpoint(this.accountEndpoint)
.withConsistencyLevel(ConsistencyLevel.Eventual)
.withConnectionPolicy(policy).build();
v3の場合
v3でも同様のプロパティは存在する。設定方法はほぼ同じだが、メソッドが異なるので注意。
// String[] REGION = {"Japan East", "Japan West"};
ConnectionPolicy policy = new ConnectionPolicy()
.usingMultipleWriteLocations(true)
.preferredLocations(Arrays.asList(REGION));
CosmosClient client = CosmosClient.builder()
.endpoint(ENDPOINT)
.key(KEY)
.consistencyLevel(ConsistencyLevel.EVENTUAL)
.connectionPolicy(policy)
.build();
ConnectionPolicy#usingMultipleWriteLocations(true) でマルチマスタの利用を宣言し、ConnectionPolicy#preferredLocations() を呼び出して、アクセス先のリージョン(Cosmos DBがレプリケートされている、書き込み可能なリージョン)を指定する。preferredLocationsへ渡す引数はListであることに注意(配列ではない)。ここで、1個だけリージョンを指定すると、当該リージョンが障害でアクセスできない場合は例外が発生するが、アプリケーションのデプロイ先リージョンを指定することで、プライマリリージョンに書き込みが集中しないように構成できる。
また、preferredLocationsに複数個のリージョンを指定すると、明示的にフォールバック時のアクセス順序を指定できる。ConnectionPolicyクラスのjavadocは以下。
com.azure.data.cosmos.ConnectionPolicy
https://azure.github.io/azure-cosmosdb-java/3.0.0/com/azure/data/cosmos/ConnectionPolicy.html