Azure service fabric 服务结构ServicePartitionResolver解析程序异步

Azure service fabric 服务结构ServicePartitionResolver解析程序异步,azure-service-fabric,Azure Service Fabric,我当前正在使用ServicePartitionResolver获取集群中另一个应用程序的http端点 var resolver = ServicePartitionResolver.GetDefault(); var partition = await resolver.ResolveAsync(serviceUri, partitionKey ?? ServicePartitionKey.Singleton, CancellationToken.None); var endpoints = J

我当前正在使用ServicePartitionResolver获取集群中另一个应用程序的http端点

var resolver = ServicePartitionResolver.GetDefault();
var partition = await resolver.ResolveAsync(serviceUri, partitionKey ?? ServicePartitionKey.Singleton, CancellationToken.None);
var endpoints = JObject.Parse(partition.GetEndpoint().Address)["Endpoints"];
return endpoints[endpointName].ToString().TrimEnd('/');

这与预期的一样,但是如果我重新部署目标应用程序,并在本地dev box上更改其端口,则源应用程序仍会返回旧的端点(该端点现在无效)。有我可以清除的缓存吗?或者这是一个bug?

是的,它们是缓存的。如果知道分区不再有效,或者收到错误,可以调用具有重载的
ResolvedServicePartition
ResolveRSP
,该重载会触发刷新

此api重载用于客户端知道 已解析的服务分区不再有效


我也看到了。

是的。它们被缓存。有两种解决方案可以克服这一问题

  • 您需要做的最简单的代码更改是替换
    var resolver=ServicePartitionResolver.GetDefault()
    var resolver=new ServicePartitionResolver()。这将强制服务每次创建一个新的
    ServicePartitionResolver
    对象。然而,
    GetDefault()
    获取缓存对象
  • [推荐]正确的处理方法是实现一个自定义的
    CommunicationClientFactory
    ,它实现了
    CommunicationClientFactoryBase
    。然后初始化一个
    ServicePartitionClient
    并调用
    InvokeWithRetryAsync
    。在“客户与工厂的沟通”一节中有明确的记录