BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

ActorFx介绍:一个云Actor运行时

| 作者 Jonathan Allen 关注 530 他的粉丝 ,译者 孙镜涛 关注 2 他的粉丝 发布于 2013年3月4日. 估计阅读时间: 5 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

由Microsoft的附属公司MS Open Tech开发的ActorFx 打算提供一个“非规范性的、独立于语言的动态分布式对象模型”。该模型由两个组件构成:actor本身及其数据存储,它们分别由接口IActor和IActorState表示。

IActorState进行状态管理

最初的IActorState是一个非常简单的接口,它的本质是一个暴露了Set、Get、TryGet、Remove和Flush方法的字典。最后一个能够异步运行的操作用于提交改变。按照约定,在调用commit方法之后改变会被自动保存到持久化存储,而在此之前则会被存储在一个“本地副作用缓冲区(local side-effect buffer)”中。

这种简化隐藏了一个秘密,那就是可以请求IActorState存储任何内容,包括活动代码(Active Code)。

Actor方法

之前使用Actor时必须教导它,让它知道自己能做什么。与传统的.NET编程不同的是,这并不是通过人工向服务器部署代码来实现的。相反,方法是在运行时使用IActor.AddAssembly函数推送到actor的。程序集由一个字节数组表示,因此能够通过线路传输并将其存储到IActorState自身内部。

这意味着每一个Actor都是一个完全封闭的对象。它没有从类或者原型(prototype)中继承方法,它自己本身就有这些方法。同时随时都可以简单地改变这些方法,只要推送一个具有同样名称的新程序集即可。

因为是一次性地加载程序集,所以实际的Actor方法需要使用ActorMethod属性标记。被该属性标记的方法必须遵循委托模式Func<IActorState, object[], object>。

向Actor发送消息

可以使用IActor.CallMethod向一个Actor发送消息。IActor.CallMethod方法有两个参数,一个是方法的名字(来源于之前添加的程序集),另一个是该方法参数的数组。它的返回类型是简单的System.Object。

通过IActor.CallMethod调用方法时,客户端还需要传入客户端ID和序列号。这样Actor运行时就能识别重复的请求并重新发送之前调用的结果。当然,客户端需要负责确保对于给定的消息这一对值是唯一的。

Actor之间的通信

Actor之间通过IActorProxy的瞬间实例进行通信。通过代理一个Actor能够调用另一个Actor的CallMethod。
除了直接的方法调用之外,还能使用代理设置订阅。基于修改版本的IObserver,来自于发布Actor的事件能够引发对订阅Actor方法的调用。调用Subscribe方法返回令牌(token)的Dispose方法便可以取消订阅。

客户端示例

到现在为止我们谈论的大部分内容都是与Actor运行时实现相关的。大多数开发者将会处理FabricActorClient这样的客户端。下面我们看看关键的方法:

public class FabricActorClient
{
public FabricActorClient(Uri fabricUri, Uri actorUri, bool useGateway);
public bool AddAssembly(string assemblyName, byte[] assemblyBytes);
public Object CallMethod(string methodName, object[] parameters);
public IDisposable Subscribe(string eventType, IObserver eventObserver);
}

再次强调,必须注意AddAssembly会查找匹配Func<IActorState, object[], object>签名的静态方法。

ActorFx 基于Apache许可,目前处于alpha状态,可以从CodePlex网站上获取。

查看英文原文:Introducing ActorFx, a Cloud Based Actor Runtime

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT