Betrouwbare actoren van Service Fabric opsommen
Met de Reliable Actors-service kan een client metagegevens opsommen over de actoren die door de service worden gehost. Omdat de actorservice een gepartitioneerde stateful service is, wordt opsomming per partitie uitgevoerd. Omdat elke partitie veel actoren kan bevatten, wordt de opsomming geretourneerd als een set gepaginade resultaten. De pagina's worden herhaald totdat alle pagina's worden gelezen. In het volgende voorbeeld ziet u hoe u een lijst maakt met alle actieve actoren in één partitie van een actorservice:
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);
Hoewel met de bovenstaande code alle actoren in een bepaalde partitie worden opgehaald, is het soms nodig om query's uit te voeren op de id's van alle actoren (actief of inactief) voor elke partitie. Dit moet worden gedaan met uitzondering omdat het een behoorlijk zware taak is.
In het volgende voorbeeld ziet u hoe u query's uitvoert op de partities van de service en elke partitie doorloopt in combinatie met het bovenstaande voorbeeld om een lijst te maken met alle actieve en inactieve actoren in de service in de Service Fabric-toepassing:
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;