示例#1
0
        private async Task RunAsync()
        {
            await GetCosmosDbAccount(_config.ResourceGroup, _config.CosmosDbName, _config.Regions);

            Console.WriteLine($"CosmosDbFailover starting...");
            Console.WriteLine($"Cosmos DB: {_config.CosmosDbName}");
            Console.WriteLine($"Regions:");
            foreach (var region in _cosmosDbAccount.Regions)
            {
                Console.WriteLine($"\t{region.LocationName}");
            }
            Console.WriteLine($"Collection: {_config.DatabaseName}.{_config.CollectionName}");
            Console.WriteLine($"RU's: {_config.CollectionThroughput}");


            Console.WriteLine("Hit Enter to start failover");
            Console.WriteLine("Hit Esc to exit test");

            var cosmosDbEndpoint = new Uri(_cosmosDbAccount.EndPoint);

            var replicaClients = new List <FailoverTestClient>();

            var defaultClient = await FailoverTestClient.GetFailoverTestClient(cosmosDbEndpoint, _cosmosDbAccount.MasterKey, _config.DatabaseName, _config.CollectionName, _config.CollectionThroughput);


            // Skip the first region, which is the primary region, to get replica regions
            var replicaRegions = _cosmosDbAccount.Regions.OrderBy(r => r.FailoverPriority).Skip(1);

            // Create DocumentDb API client in each replica region
            foreach (var replicaRegion in replicaRegions)
            {
                var replicaClient = await FailoverTestClient.GetFailoverTestClient(cosmosDbEndpoint, _cosmosDbAccount.MasterKey, _config.DatabaseName, _config.CollectionName, _config.CollectionThroughput, new List <string>() { replicaRegion.LocationName });

                replicaClients.Add(replicaClient);
            }

            try
            {
                // Create DocumentDb API client using default region


                var tasks = new List <Task>();

                var readConsoleTask = ReadConsoleKeys();
                tasks.Add(readConsoleTask);

                var writeTask = UpdateDocument(defaultClient, replicaClients);
                tasks.Add(writeTask);

                var failoverTask = Failover();
                tasks.Add(failoverTask);

                await Task.WhenAll(tasks.ToArray());
            }
            finally
            {
                if (_config.CleanupDatabaseOnFinish)
                {
                    await DocumentDbUtility.DeleteDatabase(defaultClient.DocumentClient, _config.DatabaseName);
                }
                defaultClient.Dispose();
                foreach (var replicaClient in replicaClients)
                {
                    replicaClient.Dispose();
                }
                if (_config.CleanupAcountOnFinish)
                {
                    Console.WriteLine($"Deleting {_cosmosDbAccount.EndPoint}");
                    await _cosmosDbAccount.DeleteAsync();
                }
            }
        }
示例#2
0
 private FailoverTestClient(Uri cosmosDbEndpoint, string authorizationKey, IEnumerable <string> regions = null)
 {
     _client = DocumentDbUtility.GetDocumentDbClient(cosmosDbEndpoint, authorizationKey, regions);
 }