可靠的 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();