2017-02-22 2 views
0

Kein Endpunkt für den Dienst gefunden ‚{serviceB}‘ Partition ‚{GUID}‘, die die angegebene TargetReplicaSelector passt: ‚RandomSecondaryReplica‘TargetReplicaSelector RandomSecondaryReplica Endpunkt nicht gefunden

Dies ist ein Fehler, der nicht immer zeigte sich hat, aber es tut manchmal.

Ich rufe einen Stateful-Service B von einem anderen Stateful Service A, mit Service-Remoting, um eine zufällige sekundäre Replik, um auf den primären Zustand geschrieben zuzugreifen.

Ich kann im Explorer sehen, dass die Partition dort ist und zeigt OK, und es hat eine primäre und zwei ActiveSecondaries.

Der Service B hat folgende:

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() 
{ 
    return new[] { new ServiceReplicaListener(context => 
     this.CreateServiceRemotingListener(context), listenOnSecondary: true) }; 
} 

ich alle Partitionen durch diese:

return Enumerable.Range(0, PartitionConstants.Partitions).Select(x => 
       ServiceProxy.Create<IServiceB>(
        ServiceBUri, 
        new ServicePartitionKey(x), 
        TargetReplicaSelector.RandomSecondaryReplica)); 

und die Gesamt Einstellungen OK sein muss, da es manchmal funktioniert. Und ich weiß, dass das Primärsystem reagiert, weil ich dort den Zustand gespeichert habe.

Also, was diesen Fehler verursachen könnte, wenn ich tatsächlich die Partition dort sehen kann, mit den Sekundär Repliken?

Update1: Neustart des Anrufdienstes hat die Verbindung hergestellt. Aber sie begannen zusammen, und nachdem beide gerannt und gearbeitet hatten, blieb das Problem bestehen, bis ich wieder anfing. Woher?

Update2: Dies geschieht, wenn ganze Cluster gestartet wird. Beim Start rufen Service A-Vorwahlen Service B-Vorwahlen für einige Registrierungen auf. A fragt B ab, um zu wissen, dass es zuvor seinen internen Zustand initiiert hat.

Dann, wenn dies abgeschlossen ist, überprüft Service A, ob sein interner Status aktualisiert werden muss, und wenn dies der Fall ist, wird Service B erneut aufgerufen, um den Status abzurufen. Da es nicht in den B-Zustand schreibt, ruft es sekundäre Replikate auf. Und hier ist der Endpunkt nicht gefunden. Wenn ich Dienst A neu starte, werden Endpunkte gefunden.

Könnte es sein, dass Vorwahlen funktionieren und OK, aber die Secondaries sind noch nicht OK? Wie kann ich das feststellen? Gibt es eine Service-Fabric-Klasse, auf die ich zugreifen kann, um zu erfahren, ob die sekundäre Klasse gefunden wird, wenn ich sie anrufe?

Antwort

1

Mit einem service primer found here, löste dieses Problem. Scheint, dass nicht alle Partitionsrepliken bereit waren, als sie aufgerufen wurden.

Im Grunde werden alle Replikate aller Partitionen über FabricClient gezählt, bis die erwartete Anzahl gefunden wurde.

Hier Code:

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); 
       } 
      } 
     } 
Verwandte Themen