Service Fabric:插件与应用程序类型

Service Fabric: Plugins vs. Application Types

我正在开发一个基于 Service Fabric 的交易平台,该平台将托管数百种不同的长期 运行 交易算法,所有这些算法都符合一个通用接口并共享大量通用代码,但可以它们的内部细节有很大不同。我可以将每个不同的算法建模为一个应用程序类型(我将动态加载)但是考虑到大量不同的算法我不得不想知道是否创建一个单一的 Plugin Runner 应用程序类型然后将算法实现为更有意义插件。

在一个相关问题中,我了解一般如何实现插件架构,但我不太确定将实际插件放在哪里才能被 运行 上的实例发现服务结构。

无论如何,感谢您的帮助....

  1. 我认为这两种方法都可以。使用大量应用程序类型会增加 运行 大量进程的(显着)开销,但允许您同时使用和升级同一算法的多个版本 运行。 使用插件方法需要您自己处理版本控制。

    使用应用程序方法可能需要某种请求路由器,而 插件服务可以做出自己的决定(如果它是无状态的)。

  2. 你可以创建一个Stateful服务作为插件仓库,或者挂载文件共享,或者使用数据库,不受平台限制。您可以使用命名约定来找到合适的插件。

如果在更改给定应用程序实例所需的插件集时您可以接受应用程序升级,则以下方法可能会奏效。

回想一下,Service Fabric 应用必须在部署或升级之前打包。使用 msbuild 任务或 Powershell,您可以将插件 dll 复制到插件运行器服务的代码包中,作为应用程序升级之前的 post 打包步骤。然后,您的插件 dll 将在服务启动时使用 Assembly.Load 和代码包的路径可用,在您的服务实现的 Context.CodePackageActivationContext.GetCodePackageObject("Your-Code-Package-Name").Path 属性 中可用。代码包名称在ServiceManifest.xml中定义,默认命名为Code