可用性
我可以在我的项目中使用Orleans了吗?
当然可以,Orleans使用MIT协议开源,NuGet包已发布在
nuget.org
上。
Orleans可以用于生产环境了吗?我听说这是一个研究性项目。
事实上,Orleans最初是做为微软研究院的研究项目,但自2011年以来它已经发展成为一种产品,并用于微软的生产环境。2015年公开发布后被其它公司使用。所以 Orleans 绝对可以用于生产,并为许多高可用性系统和云服务提供支持。
微软还会继续提供支持吗?
Orleans的源代码已经在GitHub上的MIT许可下发布。微软会继续在Orleans投资并接受社区对代码库的贡献。
定位
Orleans 是一个服务器产品吗?我要如何运行它?
Orleans是一个框架,可以帮助您构建应用程序。Orleans的应用程序可以在各种托管环境、云端或本地集群中运行,甚至可以在单台计算机上运行。应用程序开发人员可以在其目标托管环境中构建、部署和运行基于Orleans的应用程序。
Orleans可以运行在哪里?
Orleans 可以在任何可以运行.NET应用的环境中运行。在Orleans 2.0以前,它需要.Net Framework Full;从2.0开始,Orleans 符合.NET Standard 2.0,因此可以在任何支持.Net Core的环境上运行。
Orleans 是为Azure而创造
不。我们相信您应该能够以您需要的方式在任何地方运行Orleans。 Orleans非常灵活,并且有许多可选的提供程序可以帮助在云环境中托管它,例如Azure,AWS或GCP,或者在本地集群上。
奥尔良和其他Actor语言或框架有什么区别,比如Erlang或Akka?
虽然都基于相同的Actor基本原则,但Orleans向前迈出了一大步,并引入了虚拟Actor的概念,极大地简化了开发人员的体验,更适合云服务和大规模系统
微软有另一个Actor模型的实现(Azure Service Fabric Reliable Actors)我如何在两者之间做出选择?
Reliable Actors和Service Fabric紧密集成,以利用其核心功能,例如复制的群集内存储。 Orleans具有更丰富的功能集,不依赖于任何特定的托管平台,并且几乎可以在任何环境中运行。另外 Orleans 提供了一个可选的包,用于在Service Fabric中托管Orleans应用程序。
最后,应用程序开发人员会在Reliable Actors与Service Fabric的底层平台的紧密集成及Orleans灵活性间做出取舍。
设计
在我的申请中,Grain应该有多大或多小?
Grain 隔离模型使它们非常善于表示独立的状态和上下文。在大多数情况下,Grain 自然地映射到用户,Session,帐户等应用程序实体。这些实体通常彼此隔离,可以独立访问和更新,并公开一组定义明确的操作。这与直观的 “一个实体 - 一个Grain” 的模型相搭配。
如果应用程序实体封装太多状态,则可能使 Grain 太大而无法通过单个粒度有效地表示,因此必须处理对它的高请求率。即使单个Grain 通常每秒可以处理多达几千个普通的呼叫,但经验告诉我们,要警惕每秒接收数百个请求的单个Grain。这可能是Grain太大的迹象,需要将将其分解成一组较小的 Grain 可能更利于的系统稳定和平衡。
应用程序实体可能太小而不能成为一个Grain,如果这会导致其他Grain 与其持续交互,结果导致过多的消息传递开销。在这种情况下,使那些紧密相互作用的实体成为单个Grain的一部分可能更有意义,因此它们将直接相互调用。
你应该如何避免 Grain 热点?
粒度的吞吐量受其激活可以执行的单个线程的限制。因此,建议避免单个Grain 收到不成比例的请求或涉及处理对其他 Grain 的请求的设计。有各种模式有助于防止单个Grain 过载,即使逻辑上它是一个中心通信点。
例如,如果 Grain 是某些计数器或统计数据的聚合器,这些计数器或统计数据是由大量 Grain 定期报告的,合理的方式是添加受控数量的中间聚合物 Grain 并分配每个报告 Grain,使得负载或多或少均匀地分布在所有中间聚合器Grain 上,而这些粒子又定期将部分聚合报告给中央聚合器 Grain 。
单个Orleans集群可以跨多个数据中心运行吗?
奥尔良集群目前仅限于每个集群的单个数据中心。相反,从1.3.0开始,您可以考虑多集群部署,其中部署到不同数据中心的集群形成单个多集群。
在什么情况下可以发生脑裂(同时在多个Silos 中激活相同的Grain)?
在正常操作期间,Orleans运行时保证每个粒子在群集中最多只有一个实例。唯一一次可以违反此保证的是当一个
Silo
在没有正确关闭的情况下崩溃或被杀死。在这种情况下,有一个约30秒(基于配置)窗口期,其中Grain 可能会在多个 Silo 中临时实例化。保证每个颗粒的单个实例的收敛,并且当该窗口期关闭时,将禁用重复激活。您还可以查看Orleans的论文以获取更详细的信息,但是您无需完全理解它就能编写应用程序代码。您只需要考虑在编写应用程序时有两个actor实例的罕见可能性。持久性模型保证在这种情况下不会盲目地覆盖存储的写入。
如何使用
我该如何卸载一个Grain?
通常,不需要应用程序逻辑来强制停用Grain,因为Orleans 运行时自动检测并停用空闲的Grain以回收系统资源。让Orleans这样做更有效率,因为它会批量停用操作而不是逐个执行它们。在极少数情况下,如果您认为需要加速停用Grain,可以通过调用
base.DeactivateOnIdle()
方法来实现。
我可以告诉Orleans在哪里激活Grain吗?
可以使用限制性安置策略来实现,但我们通常认为这是一个比较高级的使用方式,需要慎重考虑。在这种情况下,应用程序将在不一定充分了解有关系统全局状态情况下,而去承担资源管理的负担。在
Silo
重启的情况下,这将适得其反,因为在云环境中可能会定期进行操作系统修补而造成应用重启。因此,特定的安置策略可能会对您的应用程序的可伸缩性以及对系统故障后的恢复能力产生负面影响。话虽如此,对于应用程序确实知道应该激活特定Grain的罕见情况,例如,如果它知道谷物持久状态的位置,在1.5.0中我们引入了自定义安置策略和
Directors
。
如何管理Grain版本,或添加新的Grain实现和接口?
您可以将具有新Grain或现有Grain的新版本的
Silo
添加到正在运行的集群中。
我可以从公共互联网连接到奥尔良 Silo 吗?
Orleans旨在作为服务的后端部分托管,从安全角度考虑,不建议将其Tcp端点公开在互联网上。通常采用WebApi的方式对外公开接口,对内在WebApi中使用Client连接Orleans Grain.
如果一个Silo 在我的Grain调用返回前出错了会发生什么?
如果在 Grain 调用过程中发生 Silo 故障,您将收到一个异常,您可以在代码中捕获并重试或根据应用程序逻辑执行其他操作来处理错误。因 Silo 失败所影响的 Grain 将在下次调用时自动重新实例化。Orleans Runtime 不会急切地从故障 Silo 中重新创建 Grain ,因为许多 Grain 可能不会立即或根本不需要。相反,运行时会单独重新创建此类 Grain ,并且仅在新请求到达特定 Grain 时才会重新创建。对于每种 Grain ,它选择一个可用的 Silo 作为新的主机。
这种方法的好处是恢复过程仅针对实际使用的 Grain 进行,并且在所有可用的 Silo 中及时传播,这提高了系统的响应性和恢复速度。另请注意,在 Silo 故障和 Orleans 集群检测到故障之间存在延迟。延迟是检测速度和误报概率之间的可配置权衡。在此过渡期间,对 Grain 的所有调用都将失败,但在检测到失败后,Grain 将在新调用时在另一个筒仓上创建,因此最终可用。
如果谷物调用执行时间过长会发生什么?
由于 Orleans 使用合作多任务模型,它不会自动抢占 Grain 的执行,但Orleans 会为长时间执行的 Grain 调用生成警告,以便您可以检测它们。与抢先式多任务相比,协作式多任务处理具有更好的吞吐量。但请记住,Grain 调用不应同步执行任何长时间运行的任务(如IO操作),也不应阻止其他任务完成。所有等待都应该使用await关键字或其他异步等待机制异步完成。 Grain 应该尽快返回,让其他 Grain 执行以获得最大吞吐量。