让我们来看看在.NET生态系统中我们有哪些工具可以使用。在接下来的几节中,我们将介绍流行的框架选择。Orleans, Proto.Actor, Akka.Net, 和Dapr。我们将重点介绍它们的独特功能和方法。
Orleans Orleans框架是虚拟actor模型的前身。它来自于2010年开始的一个微软研究项目。它为《光环4》等知名游戏的后台服务提供了支持。当它开始的时候,它的边缘有点粗糙,有静态类,大量的反射,XML配置等等。然而现在,经过几次迭代后,它的使用已经相当愉快了。
Orleans只关注虚拟行为体模型--传统的行为体层次结构不被明确支持。
Orleans实现了自己的集群机制,并依靠外部数据库为集群成员提供成员信息。Orleans也有自己的代码生成的串行器用于远程信息传递(尽管串行器是可插拔的)。同样,网络协议也是奥尔良特有的。
优点
缺点
Akka.Net Akka.Net是来自Java生态系统的Akka项目的一个移植。它是.NET基金会下的一个项目,由Petabridge公司支持。它有一个开源的核心和作为商业插件提供的工具和服务。
为另一个框架的近似移植,Akka.Net带来了原版的所有好主意,但也带来了有争议的设计决定(例如HOCON配置)。
Akka.Net主要集中在传统角色和监督层次的使用案例上。但它也有集群模块,可以跨多台机器创建角色系统。特别是,集群分片机制类似于虚拟行为体的方法。从用户的角度来看,主要的区别是Akka.Net不处理单一的虚拟角色。它而是根据用户指定的分片策略将它们分组为分片,然后将这些分片分配给集群中的机器。它在这方面有一些独特的解决方案,这将在另一篇博文中讨论。
Akka.Net遵循的路线是实现自己的集群机制以及网络协议和序列化(可以交换实现)。虽然开箱即用的1.4版本使用了Newtonsoft JSON序列化器,但我们的测试表明,使用Hyperion序列化器(目前正在测试)可以获得更好的性能。
优点
缺点
Proto.Actor Proto.Actor是由Akka.Net的创建者创建的一个框架。它吸收了Akka.Net的经验,但同时也将 "不要重新发明轮子 "作为其主要理念。
这意味着像序列化、消息传递和集群等方面都重复使用了现有的和经过战斗检验的解决方案。特别是,Proto.Actor使用了带有protobuf的gRPC。它还使用现有的集群提供者,如Consul、Zookeeper,甚至是原生的Kubernetes APIs。你可以选择适合你的用例和基础设施的实现。
虚拟actor是Proto.Actor中的第一类概念。该框架有很多方式支持这种编程模型,包括代码生成的基类,这些基类封装了低层次的通信问题。同时,也可以创建传统的监督层次。这些方法在Proto.Actor中很容易混合和匹配。
Proto.Actor还提供了一个有趣的机制,叫做Local Affinity,我们将在后面的博文中探讨。另一个区别在于该框架的Go版本。
优点
缺点
Dapr Dapr是另一个由微软支持的开源项目。它是一个更广泛的框架,提供服务发现、服务间安全可靠的通信以及存储和pub-sub功能的抽象。但Dapr的一个额外的部分是虚拟角色模型的实现,其中有一些从奥尔良借来的概念。
Dapr以一种与技术无关的方式实现其功能。该框架本身是用Go编写的,但它运行在实际应用的旁边(例如在sidecar容器中),并通过HTTP或gRPC调用与之进行通信。这很有趣,因为你可以用任何技术建立一个基于行为体的解决方案。然而,Dapr运行时并没有照顾到一个关键的方面--角色的状态。行为体应该把它的状态保存在内存中,只有在需要时才与持久化存储进行交互。如果你使用Dapr SDK之一,状态会被缓存在内存中,否则你必须自己实现一个类似的解决方案。
缺点是,边车的方法会引入开销。看起来,Dapr的虚拟演员实现并不是为了高吞吐量的场景。
展示的应用程序,eShopOnDapr,使用虚拟角色来实现一个持久的工作流(流程管理器模式),这是一个有趣的用例。
优点
缺点