gpt4 book ai didi

Azure 服务结构 : How to find out if an Actor already exists

转载 作者:行者123 更新时间:2023-12-02 09:25:45 25 4
gpt4 key购买 nike

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

ActorProxy 仅用于创建 Actor。如果提供的 ID 不存在,并且 Actor 不存在,则会创建一个新 Actor。

标准 ActorService 可以检索所有 Actor,但据我所知仅此而已。

最佳答案

目前没有简单的方法可以做到这一点。 Actor 旨在抽象对象实例的生命周期。只需在需要时调用电话,它就会出现。所以我不确定这是否真的需要。

也就是说,您可以创建另一个服务方法来迭代服务器端的所有 Actor,而不是将整个列表拉到客户端,但如果您有数百万个 Actor 实例,效率不会很高。

或者,您可以在 Actor 初始化期间存储标记状态,并查询其状态提供程序 - 代价是为 Actor 增加更多状态和复制开销。

首先,创建一个服务接口(interface):

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

然后,创建一个实现此接口(interface)的自定义参与者服务:

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

最后,在注册 Actor 时使用它,例如:

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

关于Azure 服务结构 : How to find out if an Actor already exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38271377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com