Wyliczanie elementów Reliable Actors usługi Service Fabric
Usługa Reliable Actors umożliwia klientowi wyliczanie metadanych dotyczących podmiotów hostujących usługę. Ponieważ usługa aktora jest partycjonowaną usługą stanową, wyliczanie jest wykonywane na partycję. Ponieważ każda partycja może zawierać wiele aktorów, wyliczenie jest zwracane jako zestaw stronicowanych wyników. Strony są zapętlone do momentu odczytania wszystkich stron. W poniższym przykładzie pokazano, jak utworzyć listę wszystkich aktywnych aktorów w jednej partycji usługi aktora:
IActorService actorServiceProxy = ActorServiceProxy.Create(
new Uri("fabric:/MyApp/MyService"), partitionKey);
ContinuationToken continuationToken = null;
List<ActorInformation> activeActors = new List<ActorInformation>();
do
{
PagedResult<ActorInformation> page = await actorServiceProxy.GetActorsAsync(continuationToken, cancellationToken);
activeActors.AddRange(page.Items.Where(x => x.IsActive));
continuationToken = page.ContinuationToken;
}
while (continuationToken != null);
ActorService actorServiceProxy = ActorServiceProxy.create(
new URI("fabric:/MyApp/MyService"), partitionKey);
ContinuationToken continuationToken = null;
List<ActorInformation> activeActors = new ArrayList<ActorInformation>();
do
{
PagedResult<ActorInformation> page = actorServiceProxy.getActorsAsync(continuationToken);
while(ActorInformation x: page.getItems())
{
if(x.isActive()){
activeActors.add(x);
}
}
continuationToken = page.getContinuationToken();
}
while (continuationToken != null);
Chociaż powyższy kod pobierze wszystkich aktorów w danej partycji, czasami konieczne będzie wysłanie zapytania o identyfikatory wszystkich aktorów (aktywnych lub nieaktywnych) w każdej partycji. Powinno to być wykonywane przez wyjątek, ponieważ jest to dość ciężkie zadanie.
W poniższym przykładzie pokazano, jak wykonać zapytanie o partycje usługi i wykonać iterację po każdej z nich w połączeniu z powyższym przykładem, aby utworzyć listę wszystkich aktywnych i nieaktywnych aktorów w usłudze w aplikacji usługi Service Fabric:
var serviceName = new Uri("fabric:/MyApp/MyService");
//As the FabricClient is expensive to create, it should be shared as much as possible
FabricClient fabricClient = new();
//List each of the service's partitions
ServicePartitionList partitions = await fabricClient.QueryManager.GetPartitionListAsync(serviceName);
List<Guid> actorIds = new();
foreach(var partition in partitions)
{
//Retrieve the partition information
Int64RangePartitionInformation partitionInformation = (Int64RangePartitionInformation)partition.PartitionInformation; //Actors are restricted to the uniform Int64 scheme per https://learn.microsoft.com/azure/service-fabric/service-fabric-reliable-actors-introduction#distribution-and-failover
IActorService actorServiceProxy = ActorServiceProxy.Create(serviceName, partitionInformation.LowKey);
ContinuationToken? continuationToken = null;
do
{
var page = await actorServiceProxy.GetActorsAsync(continuationToken, cancellationToken);
actorIds.AddRange(page.Items.Select(actor => actor.ActorId.GetGuidId());
continuationToken = page.ContinuationToken;
} while (continuationToken != null);
}
return actorIds;