gpt4 book ai didi

c# - 使用 Azure 地理冗余 (RA-GRS) 表存储时,如何更新 ASP.NET Core 中的 TableServiceClient 以指向辅助区域?

转载 作者:行者123 更新时间:2023-12-05 03:33:09 26 4
gpt4 key购买 nike

我正在使用最新的 Azure.Data.Tables nuget 包(版本 12.3.0)来连接到 ASP.NET Core C# 应用程序中的 Azure 表存储。

如果主要区域发生故障,我的应用程序需要故障转移到次要区域以进行读取

目前,TableServiceClient 的设置是在 Startup.cs 中完成的,如下所示:

public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(new TableServiceClient(new Uri("PrimaryRegionConnectionURL"), new DefaultAzureCredential()));
}

如何使用指向次要区域的实例更新 TableServiceClient 的当前实例?有没有更好的方法来实现这种故障转移?

澄清一下:我知道客户端不支持故障转移,团队已经创建了一个票证以在将来查看此功能。我意识到我需要一个 TableServiceClient 的新实例。

我只是不确定如何用失败时指向辅助实例的新实例替换启动时创建的实例

这是使用TableServiceClient的代码

    public class TableRepository : ITableStorageRepository
{
readonly TableServiceClient _serviceClient;

public TableRepository(TableServiceClient serviceClient)
{
_serviceClient = serviceClient;
}

public async Task<ICollection<T>> GetPartitionEntities<T>(string partitionKey, string tableName)
where T : class, ITableEntity, new()
{
var listOfEntities = new List<T>();

var tableClient = _serviceClient.GetTableClient(tableName);

var queryResults = tableClient.QueryAsync<T>(filter => filter.PartitionKey == partitionKey);

await foreach (var row in queryResults)
{
listOfEntities.Add(row);
}

return listOfEntities;
}
}

最佳答案

不确定这是否是实现它的最佳方法,但考虑到我必须自己处理主要端点和辅助端点之间的切换逻辑,这就是我的做法。

首先,我将创建两个 TableServiceClient 实例 - 一个用于主实例,另一个用于辅助实例。

public void ConfigureServices(IServiceCollection services)
{
Dictionary<string, TableServiceClient> tableServiceClients = new Dictionary()
{
"Primary", new TableServiceClient(new Uri("PrimaryRegionConnectionURL"), new DefaultAzureCredential()),
"Secondary", new TableServiceClient(new Uri("SecondaryRegionConnectionURL"), new DefaultAzureCredential())
}
services.AddSingleton(tableServiceClients);
}

接下来,我将提取用于在单独的函数中获取实体的逻辑,并将客户端传递给该函数(我们称之为 GetPartitionEntitiesImpl)。

然后在 GetPartitionEntities 方法中,我会尝试从主端点获取实体并捕获异常。如果异常表明主端点失败,我将再次调用 GetPartitionEntitiesImpl 函数并尝试从辅助端点获取实体。

public class TableRepository : ITableStorageRepository
{
readonly TableServiceClient _primaryServiceClient, _secondaryServiceClient;

public TableRepository(Dictionary<string, TableServiceClient> tableServiceClients)
{
_primaryServiceClient = tableServiceClients["Primary"];
_secondaryServiceClient = tableServiceClients["Secondary"];
}

public async Task<ICollection<T>> GetPartitionEntities<T>(string partitionKey, string tableName)
where T : class, ITableEntity, new()
{
try
{
return await GetPartitionEntitiesImpl(_primaryServiceClient, partitionKey, tableName);
}
catch (Exception exception)
{
//Check if there is a need for failover
if (shouldTrySecondaryEndpoint)
{
return await GetPartitionEntitiesImpl(_secondaryServiceClient, partitionKey, tableName);
}
}
}

private async Task<ICollection<T>> GetPartitionEntitiesImpl<T>(TableServiceClient serviceClient, string partitionKey, string tableName)
where T : class, ITableEntity, new()
{
var listOfEntities = new List<T>();

var tableClient = serviceClient.GetTableClient(tableName);

var queryResults = tableClient.QueryAsync<T>(filter => filter.PartitionKey == partitionKey);

await foreach (var row in queryResults)
{
listOfEntities.Add(row);
}

return listOfEntities;
}

}

此外,请查看旧版 Azure 存储 SDK(版本 9.x)中有关主端点和辅助端点之间切换逻辑的代码。该 SDK 很好地处理了这种情况。

关于c# - 使用 Azure 地理冗余 (RA-GRS) 表存储时,如何更新 ASP.NET Core 中的 TableServiceClient 以指向辅助区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70365260/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com