可靠的 Actor

Service Fabric 中的 actor 由标准 .NET 接口/类对定义:

public interface IMyActor : IActor
{
    Task<string> HelloWorld();
}

internal class MyActor : Actor, IMyActor
{
    public Task<string> HelloWorld()
    {
        return Task.FromResult("Hello world!");
    }
}

接口/类对中的每个方法都必须是异步的,并且它们不能具有 out 或 ref 参数。

如果你考虑 Actor 模型,很容易理解为什么:对象通过交换消息相互交互。消息通过异步方法传递给 actor 类; 响应由 actor 运行时(actor容器)处理并路由回调用者。

Service Fabric SDK 将在编译时生成代理。这个代理由 actor 客户端用来调用它的方法(即向 actor 发送一条消息,然后传递一个响应)。

客户端通过 ID 识别 Actor。ID 可以是已知的(你从 DB,另一个 Actor 获取它,或者可能是链接到该 actor 的 userID,或者是真实对象的序列号)。

如果你需要创建一个新的 actor 并且你只需要一个 ID,那么(提供的)ActorId 类具有创建随机分布的 actor ID 的方法

ActorId actorId = ActorId.NewId();

然后,你可以使用 ActorProxy 类为 actor 创建代理对象。这不会激活 actor 或调用任何方法。IMyActor myActor = ActorProxy.Create(actorId,new Uri(“fabric:/ MyApp / MyActorService”));

然后,你可以使用代理来调用 actor 上的方法。如果具有给定 ID 的 actor 不存在,它将被激活(在集群中的一个容器内创建),然后运行时将向 actor 发布消息,执行其方法调用并在 actor 时完成 Task 答案:

await myActor.HelloWorld();