2017-02-22 28 views
0

Нет конечной точки не найдено для сервиса «{serviceB}» раздела «{GUID}», что соответствует указанному TargetReplicaSelector: «RandomSecondaryReplica»TargetReplicaSelector RandomSecondaryReplica конечная точка не найдена

Это ошибка, которая не всегда проявляла, но это иногда.

Я звоню в службу поддержки состояния B из другой службы с сохранением состояния A, с обслуживанием, запрашивающим случайную вторичную реплику, для доступа к состоянию, записанному в первичный.

В проводнике я вижу, что раздел существует и показывает ОК, и у него есть первичный и два ActiveSecondaries.

Служба 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 назовут приоритеты обслуживания B для некоторой регистрации. Опрос B, чтобы знать, что он начал свое внутреннее состояние, прежде чем делать это.

Затем, когда это будет завершено, служба A продолжит проверять, нуждается ли его внутреннее состояние, и если это так, он снова вызовет службу B для извлечения состояния. Поскольку он не будет записывать в состояние B, он вызывает вторичные реплики. И вот когда конечная точка не найдена. Когда я перезапускаю службу A, будут найдены конечные точки.

Не может быть, что праймериз работают и хорошо, но вторичные устройства еще не в порядке? Как я могу это выяснить? Есть ли какой-либо класс рабочей среды, к которому я могу получить доступ, чтобы узнать, будет ли вторичное обнаружение, если я его вызову?

ответ

1

Используя service primer found here, эта проблема решена. Похоже, что не все реплики разделов были готовы при вызове.

В основном, это то, что он считает все реплики всех разделов через 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); 
       } 
      } 
     } 

 Смежные вопросы

  • Нет связанных вопросов^_^