Service Fabric Actors位于单独的AppDomain中

时间:2016-04-25 15:54:45

标签: azure-service-fabric

我正在考虑一种设计,其中" DynamicActors"能够在动态创建的AppDomain中从给定文件共享加载和执行任意代码。像这样的伪代码

class DynamicActor: Actor, IDynamicActor

  Task ExecuteAsync(string assemblyName, string typeName)      
    AppDomain appDomain = AppDomain.CreateDomain(...)
    appDomain.SetData("AssemblyName", assemblyName)
    appDomain.SetData("TypeName", typeName)
    appDomain.DoCallBack(<load the type and execute a predefined / interface method>)

基本原理是能够频繁更新动态加载的代码,而无需升级DynamicActors服务。

一般来说这是个好主意吗?

隔离的AppDomain中动态加载的代码是否可以使用SF运行时,例如创建一个actor代理并调用其方法?

谢谢,

帕洛阿

2 个答案:

答案 0 :(得分:1)

如果您只是想要一种升级演员服务代码的方法,那么这听起来不是一个好主意。应用程序升级是Service Fabric的核心方案,Service Fabric做得很好。如果您使用动态程序集加载来设计自己的程序集,那么您必须考虑版本控制,运行状况监视,安全滚动升级,回滚等等,所有这些都是Service Fabric所做的。

如果你正在寻找一个&#34;插件&#34;用户可以运行插件的模型,我可能会建议查看为此目的设计的Managed Extensibility Framework

答案 1 :(得分:1)

在考虑了Vaclav的回答后,我决定转到下面描述的“所有Service Fabric”路线。在此之前,让我告诉您有关应用程序场景的更多信息:

  • 将有数百个的程序集实现无人参与的ETL类型“任务”。
  • 任务将定期执行,持续时间为秒,最多为一分钟。
  • 任务程序集必须单独进行版本控制(包括它们的依赖项),并且它们将经常被版本化。
  • 任务程序集必须不依赖于SF程序集。

目标实际上是使用Service Fabric集群来执行可通过文件共享访问的任何代码。

我在GitHub上提出了一个示例概念验证解决方案 - https://github.com/PaloMraz/ServiceFabricDynamicTaskExecution

注意:在下面的讨论中,术语“任务”表示具有公共默认构造函数的任何公共类,它使用以下签名公开public方法:

Task<string> ExecuteAsync(string parameters)

样本解决方案包含以下组件:

包含具有单个ExecuteTaskAsync方法的TaskExecutorActor actor的

TaskExecutorActors 服务:

Task<string> ExecuteTaskAsync(string taskAssemblyPath, string taskClassName, string taskParameters);

该实现使用Activator.CreateInstanceFrom API来实例化指定程序集中的类,然后使用指定的参数调用ExecuteAsync方法。

TaskExecutorGateway 是一种无状态服务,它公开要从群集外部调用的Web API HTTP端点。

TaskExecutorClientLib 是一个包含TaskExecutorClient类的类库,其中包含用于轻松调用TaskExecutorGateway HTTP端点的方法:

Task<string> ExecuteTaskAsync(string taskAssemblyPath, string taskClassName, string taskParameters)

在TaskExecutorGateway中实现此方法使用传入的taskAssemblyPath的目录名来创建TaskExecutorActors服务的唯一实例,以从目录中的程序集加载和执行任务。

一旦由TaskExecutorActors服务进程加载,任务程序集就会被锁定,无法替换。为了替换程序集,TaskExecutorClient公开了另一种方法:

Task<string> UnloadTaskAssembliesAsync(string assembliesFolderPath)

实现(在TaskExecutorGateway内部)只是删除按需创建的“目录绑定”TaskExecutorActors服务,拆除其进程并释放已加载的程序集。

该解决方案包含两个示例任务程序集和一个 TaskExecutorTestConsole 控制台项目,其中一些代码可用于整个基础架构。

请注意:TaskExecutorGateway通过端口80公开Web API,因此如果您的本地开发群集中有其他应用程序,请确保在ServiceManifest.xml和TaskExecutorTestConsole示例代码中更改此项。已经在端口80上听了。

您对此SF使用模式有何看法?