Aracılığıyla paylaş


Service Fabric Reliable Actors'ı listeleme

Reliable Actors hizmeti, istemcinin hizmetin barındırdığını aktörler hakkındaki meta verileri listelemesine olanak tanır. Aktör hizmeti bölümlenmiş durum bilgisi olan bir hizmet olduğundan, numaralandırma bölüm başına gerçekleştirilir. Her bölüm birçok aktör içerebileceğinden, numaralandırma bir dizi sayfalanmış sonuç olarak döndürülür. Tüm sayfalar okunana kadar sayfalar döngüye alınıyor. Aşağıdaki örnekte, bir aktör hizmetinin bir bölümünde tüm etkin aktörlerin listesinin nasıl oluşturulacağı gösterilmektedir:

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);

Yukarıdaki kod belirli bir bölümdeki tüm aktörleri alır ancak bazen her bölümdeki tüm aktörlerin (etkin veya etkin olmayan) kimliklerini sorgulama gereksinimi ortaya çıkar. Bu, oldukça ağır bir görev olduğundan özel durum tarafından yapılmalıdır.

Aşağıdaki örnekte, Service Fabric uygulaması genelinde hizmetteki tüm etkin ve etkin olmayan aktörlerin listesini oluşturmak için hizmetin bölümlerini sorgulama ve yukarıdaki örnekle birlikte her birinde yineleme gerçekleştirme adımları gösterilmektedir:


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;

Sonraki adımlar