Azure service fabric 找不到TargetReplicaSelector RandomSecondary副本终结点

Azure service fabric 找不到TargetReplicaSelector RandomSecondary副本终结点,azure-service-fabric,Azure Service Fabric,找不到与指定TargetReplicaSelector匹配的服务“{serviceB}”分区“{guid}”的终结点:“RandomSecondaryReplica” 这是一个并不总是出现的错误,但有时会出现 我从另一个有状态服务a调用一个有状态服务B,使用服务远程处理,请求一个随机的辅助副本,以访问写入主服务器的状态 我可以在资源管理器中看到分区在那里,显示OK,它有一个主分区和两个ActiveSecondary分区 服务B具有以下功能: protected override IEnumera

找不到与指定TargetReplicaSelector匹配的服务“{serviceB}”分区“{guid}”的终结点:“RandomSecondaryReplica”

这是一个并不总是出现的错误,但有时会出现

我从另一个有状态服务a调用一个有状态服务B,使用服务远程处理,请求一个随机的辅助副本,以访问写入主服务器的状态

我可以在资源管理器中看到分区在那里,显示OK,它有一个主分区和两个ActiveSecondary分区

服务B具有以下功能:

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
    return new[] { new ServiceReplicaListener(context =>
        this.CreateServiceRemotingListener(context), listenOnSecondary: true) };
}
我通过以下方式获得所有分区:

return Enumerable.Range(0, PartitionConstants.Partitions).Select(x =>
                ServiceProxy.Create<IServiceB>(
                    ServiceBUri,
                    new ServicePartitionKey(x),
                    TargetReplicaSelector.RandomSecondaryReplica));
而且总体设置必须是正常的,因为有时它确实工作。我知道主服务器正在响应,因为我已经在那里保存了状态

那么,当我可以在那里看到分区和辅助副本时,是什么导致了这个错误呢

更新1:重新启动呼叫服务使连接正常工作。但他们是一起开始的,在两人都开始运行和工作之后,问题一直存在,直到我重新启动。为什么

Update2:这发生在整个集群启动时。在启动时,服务A primaries调用服务B primaries进行一些注册。在进行此操作之前,A轮询B以了解其已启动内部状态

完成后,服务A继续检查其内部状态是否需要更新,如果需要,它将再次调用服务B以检索状态。因为它不会对B状态进行任何写入,所以它调用辅助副本。这里是找不到端点的时候。 当我重新启动服务时,会找到端点

是不是初选成功了,但二选还没有成功? 我怎样才能确定这一点?是否有一些服务结构类可供我访问,以了解如果我调用它,是否会找到辅助服务结构类?

使用,解决了此问题。似乎并不是所有分区副本在被调用时都准备好了

基本上,它所做的是通过FabricClient统计所有分区的所有副本,直到找到预期的数量为止

以下是代码:

public async Task WaitForStatefulService(Uri serviceInstanceUri, CancellationToken token)
        {
            StatefulServiceDescription description =
                await this.Client.ServiceManager.GetServiceDescriptionAsync(serviceInstanceUri) as StatefulServiceDescription;

            int targetTotalReplicas = description.TargetReplicaSetSize;
            if (description.PartitionSchemeDescription is UniformInt64RangePartitionSchemeDescription)
            {
                targetTotalReplicas *= ((UniformInt64RangePartitionSchemeDescription)description.PartitionSchemeDescription).PartitionCount;
            }

            ServicePartitionList partitions = await this.Client.QueryManager.GetPartitionListAsync(serviceInstanceUri);
            int replicaTotal = 0;

            while (replicaTotal < targetTotalReplicas && !token.IsCancellationRequested)
            {
                await Task.Delay(this.interval);
                //ServiceEventSource.Current.ServiceMessage(this, "CountyService waiting for National Service to come up.");

                replicaTotal = 0;
                foreach (Partition partition in partitions)
                {
                    ServiceReplicaList replicaList = await this.Client.QueryManager.GetReplicaListAsync(partition.PartitionInformation.Id);

                    replicaTotal += replicaList.Count(x => x.ReplicaStatus == System.Fabric.Query.ServiceReplicaStatus.Ready);
                }
            }
        }