簡體   English   中英

Azure Service Fabric:如何確定Actor是否已存在

[英]Azure Service Fabric : How to find out if an Actor already exists

如何確定具有特定ActorId的Actor是否存在?

ActorProxy僅用於創建Actor。 如果提供了一個不存在的ID,而Actor不存在,則會創建一個新的Actor。

標准ActorService可以檢索所有Actor,但就我所知,僅此而已。

當前沒有簡單的方法可以做到這一點。 Actor旨在抽象出對象實例的生存期。 只需在需要時打個電話,它就會在那里。 所以我不確定這是否真的必要。

就是說,您可以創建另一種服務方法來遍歷服務器端的所有參與者,而不是將整個列表拉到客戶端,但是如果您有數百萬個參與者實例,那將不是很有效。

另外,您可以在參與者的初始化期間存儲標記狀態,並查詢狀態提供者-以增加向參與者增加狀態和復制開銷為代價。

首先,創建一個服務接口:

public interface IActorServiceEx : IService
{
    Task<bool> ActorExists(ActorId actorId, CancellationToken cancellationToken = default(CancellationToken));
}

然后,創建實現此接口的自定義角色服務:

internal class CustomActorService : ActorService, IActorServiceEx
{
    public CustomActorService(StatefulServiceContext context, ActorTypeInformation actorTypeInfo, Func<ActorBase> actorFactory = null, IActorStateProvider stateProvider = null, ActorServiceSettings settings = null) 
        : base(context, actorTypeInfo, actorFactory, stateProvider, settings)
    {
    }

    public async Task<bool> ActorExists(ActorId actorId, CancellationToken cancellationToken)
    {
        const int batchSize = 1000;
        ContinuationToken token = null;
        do
        {
            var actors = await StateProvider.GetActorsAsync(batchSize, token, cancellationToken);
            if (actors.Items.Contains(actorId))
            {
                return true;
            }
            token = actors.ContinuationToken;
        } while (token != null);
        return false;
    }
}

或使用標記的替代版本:

internal class Actor1 : Actor, IActor1
{
    protected override async Task OnActivateAsync()
    {
        await StateManager.TryAddStateAsync("Activated", true);
    }
}

internal class CustomActorService : ActorService, IActorServiceEx
{
    ...

    public Task<bool> ActorExists(ActorId actorId, CancellationToken cancellationToken)
    {
        return StateProvider.ContainsStateAsync(actorId, "Activated", cancellationToken);
    }
}

最后,在注冊演員時使用它,例如:

ActorRuntime.RegisterActorAsync<Actor1>((context, actorType) =>
    new CustomActorService(context, actorType,
    () => new Actor1())).GetAwaiter().GetResult();

並調用此新服務方法:

var actorService = ActorServiceProxy.Create<IActorServiceEx>(serviceUri, actorId);

var exists = await actorService.ActorExists(actorId);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM