Orleans 2.0官方文档(闫辉的个人翻译)——1.2 常见问题

常见问题

可用性

我可以在项目中自由使用奥尔良吗?

当然可以。源代码已在MIT许可发布。NuGet包发布在nuget.org上

Orleans准备用于生产了吗?我听说这是一个研究项目。

事实上,Orleans最初是作为微软研究院的研究项目开始的。它后来发展成为一种产品,并自2011年起在微软内部用于生产,并在2015年公开发布后被其他公司用于生产。Orleans无疑已经是生产就绪,并为许多高可用性系统和云服务提供支持。

微软是否支持奥尔良?

Orleans的源代码已经在GitHub上的MIT许可下发布。微软继续投资Orleans并接受社区对代码库的贡献。

定位

Orleans是服务器产品吗?我如何经营Orleans?

Orleans是一个框架,一组库,可以帮助您构建应用程序。基于Orleans的应用程序可以在各种托管环境,云中或本地群集中运行,甚至可以在单台机器上运行。应用程序开发人员有责任在其目标托管环境中构建,部署和运行基于Orleans的应用程序。

我在哪里可以跑Orleans?

Orleans可以在任何可以运行.NET应用程序的环境中运行。在Orleans 2.0之前,它需要完整的.NET Framework。从2.0开始,Orleans符合.NET Standard 2.0,因此可以在Windows和支持.NET Core的非Windows环境中的.NET Core上运行。

Orleans是否为Azure而构建?

不。我们相信您应该能够按照您需要的方式在任何地方经营Orleans。Orleans非常灵活,有许多可选的提供程序可以帮助在云环境中托管它,例如Azure,AWS或GCP,或者在本地集群上,可以选择支持Orleans集群协议的技术。

Orleans和其他Actor语言和框架有什么区别,比如Erlang或Akka?

虽然基于Actor模型的相同基本原则,Orleans向前迈进了一步,并引入了虚拟Actor的概念,极大地简化了开发人员的体验,更适合云服务和大规模系统。

Microsoft有另一个Actor模型实现 - Azure Service Fabric Reliable Actors。我如何在两者之间做出选择?

可靠的Actors与Service Fabric紧密集成,以利用其核心功能,例如复制的群集内存储。Orleans具有更丰富的功能集,不依赖于任何特定的托管平台,并且几乎可以在任何环境中运行。Orleans提供了一个可选的集成包,用于在Service Fabric中托管Orleans应用程序。

最后,应用程序开发人员决定从可靠的Actors与Service Fabric的底层平台的紧密集成以及在任何地方运行的灵活性和Orleans的功能集中获益多少。

设计

grain应该在我的应用中有多大或多小?

grain隔离模型使它们非常善于表示独立的状态和计算的孤立上下文。在大多数情况下,grain自然地映射到用户,会话,帐户等应用程序实体。这些实体通常彼此隔离,可以独立访问和更新,并公开一组定义明确的支持操作。这与直观的“一个实体 - 一个grain”建模很好地配合。

如果应用程序实体封装太多状态,则可能太大而无法通过单个grain有效地表示,因此必须处理对它的高请求率。即使单个grain通常每秒可以处理多达几千个普通的调用,但经验法则是要警惕每秒接收数百个请求的单个grain。这可能是grain过大的迹象,将其分解成一组较小的grain可能会导致更稳定和平衡的系统。

应用程序实体可能太小而不能成为grain,如果这会导致其他grain与其不断持续交互从而导致过多的消息传递开销。在这种情况下,使那些紧密相互作用的实体成为单个grain的一部分可能更有意义,这样它们就可以直接调用彼此。

你应该如何避免grain过热?

grain的吞吐量受其激活可以执行的单个线程的限制。因此,建议避免单个grain收到不成比例的请求或涉及处理对其他grain的请求的设计。有多种模式有助于防止单个grain过载,即使逻辑上它是一个中心通信点。

例如,如果grain是一些计数器或统计数据的聚合器,这些计数器或统计数据是由大量grain定期报告的,一种行之有效的方法是增加一定数量的中间聚合器grain,并将每个报告grain(使用键或哈希上的模)分配给中间聚合器grain,使得负载或多或少均匀地分布在所有中间聚合器grain上,而这些中间聚合器grain又定期将其聚合结果,报告给中央聚合器grain。

单个Orleans集群可以跨多个数据中心运行吗?

Orleans集群目前仅支持一个集群一个数据中心。作为替代解决方案,从1.3.0开始,您可以考虑进行多集群部署,其中部署到不同数据中心的集群形成单个多集群。

在什么情况下能发生“大脑分裂”(同时在多个silo中激活相同的颗粒)?

在正常操作期间,Orleans运行时保证每个grain在集群中最多只有一个实例。唯一会违反此保证的情况是,当一个silo发生崩溃或在没有正确关闭的情况下被杀掉。在这种情况下,有一个大约30秒(基于配置)窗口,其中grain可能会在多个silo中临时实例化。每个grain被保证收敛到单实例,并且该窗口关闭时,将禁用重复激活。

您还可以查看Orleans的论文以获取更详细的信息,但是您无需完全理解它,就能编写应用程序代码。在编写应用程序时,您只需要考虑拥有两个Actor实例的罕见可能性。持久性模型保证在这种情况下,不会盲目覆盖对存储的任何写入。

如何

我该如何拆掉grain?

一般来说,不需要应用程序逻辑来强制停用grain,因为Orleans运行时自动检测并停用grain的空闲激活,以回收系统资源。让Orleans这样做更有效率,因为它批量停用操作而不是逐个执行。在极少数情况下,当您认为确实需要加速一个grain的停用时,该grain可以通过调用base.deactivateOnIdle()方法来实现。

我告诉Orleans在哪里激活grain吗?

可以使用限制性放置策略来实现,但我们通常认为这是一种需要仔细考虑的相当高级的模式。通过执行问题所建议的操作,应用程序将承担资源管理的负担,而不必充分了解系统的全局状态。在silo重启的情况下——在云环境中可能会定期进行操作系统打补丁,这尤其会适得其反。因此,特定放置可能会对应用程序的可伸缩性,以及对系统故障的恢复能力产生负面影响。

话虽如此,对于应用程序确实知道应该激活特定grain的罕见情况,例如,如果它知道grain持久状态的位置,在1.5.0中我们引入了自定义放置策略和导向器。

你如何修改grain或添加新的grain类和接口?

您可以将具有新grain类或现有grain类的新版本的silo添加到正在运行的集群中。

 

可以从公共互联网连接到Orleans silo吗?

Orleans被设计为作为服务的后端部分进行托管,您需要创建外部客户端将连接的前端层。它可以是基于HTTP的Web API项目,套接字服务器,SignalR服务器或其他符合应用程序需求的东西。如果将Silo的TCP端点暴露给它,则可以从Internet连接到Orleans,但从安全角度来看,这不是一个好的实践。

如果一个Silo在我的grain返回调用后的响应之前发生故障,会发生什么情况?

如果在grain调用过程中silo发生故障,您将收到一个异常,您可以在代码中捕获并重试,或者根据应用程序逻辑执行其他操作来处理错误。随着silo失败的grain将在下次调用时自动重新实例化。Orleans运行时不会急切地从故障silo中重新创建grain,因为许多grain可能不会立即或完全被需要。相反,运行时仅在针对特定grain的新请求到达时,单独地重新创建此类grain。对于每种grain,它选择一个可用的筒silo作为新的主机。

这种方法的好处是,仅对实际使用的grain执行恢复过程,并且它会及时地在所有可用的silo中被传播,这提高了系统的响应性和恢复速度。另请注意,在silo故障和Orleans集群检测到故障之间存在延迟。延迟是检测速度和误报概率之间的可配置权衡。在此过渡期间,对grain的所有调用都将失败,但在检测到失败后,grain将在新的调用时在另一个silo上创建,因此它最终将可用。

如果grain调用执行时间过长,会发生什么?

由于Orleans使用合作多任务模型,它不会自动抢占grain的执行,但Orleans会为长时间执行的grain调用生成警告,以便您可以检测到它们。与抢占式多任务相比,协作式多任务处理具有更好的吞吐量。请记住,grain调用不应同步执行任何长时间运行的任务(如IO操作),也不应阻塞其他要完成的任务。所有等待都应该使用await关键字或其他异步等待机制异步完成。grain应该尽快返回,让其他grain执行以获得最大吞吐量。

猜你喜欢

转载自blog.csdn.net/uddiqpl/article/details/85918218