Bagikan melalui


Menghitung Service Fabric Reliable Actors

Layanan Reliable Actors memungkinkan klien menghitung metadata tentang aktor tempat layanan dihosting. Karena layanan aktor berupa layanan berstatus yang dipartisi, penghitungan dilakukan per partisi. Karena setiap partisi mungkin berisi banyak aktor, penghitungan ditampilkan sebagai serangkaian hasil yang dipaginasi. Halaman diulangi hingga semua halaman dibaca. Contoh berikut menunjukkan cara membuat daftar semua aktor aktif dalam satu partisi layanan aktor:

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

Sementara kode di atas akan mengambil semua aktor dalam partisi yang diberikan, terkadang kebutuhan akan muncul untuk menanyakan ID semua aktor (aktif atau tidak aktif) di setiap partisi. Ini harus dilakukan dengan pengecualian karena ini adalah tugas yang cukup berat.

Contoh berikut menunjukkan cara mengkueri partisi layanan dan mengulangi masing-masing dalam kombinasi dengan contoh di atas untuk menghasilkan daftar semua aktor aktif dan tidak aktif dalam layanan di seluruh aplikasi 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;

Langkah berikutnya