Vytvoření výčtu Service Fabric Reliable Actors
Služba Reliable Actors umožňuje klientovi vytvořit výčet metadat o aktérech, které služba hostuje. Vzhledem k tomu, že služba actor je dělená stavová služba, výčet se provádí pro každý oddíl. Vzhledem k tomu, že každý oddíl může obsahovat mnoho objektů actor, je výčet vrácen jako sada stránkovaných výsledků. Stránky se smyčou, dokud se nepřečtou všechny stránky. Následující příklad ukazuje, jak vytvořit seznam všech aktivních herců v jednom oddílu služby actor:
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);
I když výše uvedený kód načte všechny aktéry v daném oddílu, občas bude potřeba dotazovat ID všech objektů actor (aktivní nebo neaktivní) napříč každým oddílem. To by mělo být provedeno výjimkou, protože je to poměrně náročný úkol.
Následující příklad ukazuje, jak dotazovat oddíly služby a iterovat každou z nich v kombinaci s výše uvedeným příkladem, aby se vytvořil seznam všech aktivních a neaktivních herců ve službě napříč aplikací 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;