假设在Azure服务结构集群上运行了一个已命名的应用程序。这个命名的应用程序有5种不同的服务。
这些服务是在不同的流程还是在同一流程中运行?如果这些服务不是.net服务并且可执行,该怎么办?
答案 0 :(得分:3)
来宾EXE总是有自己的流程。
否则,有两种托管模式可用:
独家流程 - 这个非常简单,所以让我们从这里开始吧。在这种模式下,所有都有自己的进程。每个应用程序的每个服务实例的每个分区的每个副本都有自己的独占主机进程。这是我推荐的托管模式,因为它是最简单的,通常会带来更多的稳定性和更容易调试的服务。
共享流程 - 这会变得有点复杂。在应用程序实例中,同一服务类型的所有内容共享一个主机进程。因此,举例来说,让我们说你有一个应用程序:
fabric:/myapp
在该应用程序中,您有两种服务类型:
service-type-1 (stateful)
service-type-2 (stateless)
现在让我们假设您创建一个service-type-1
的实例,每个分区有5个分区和3个副本:
fabric:/myapp/mystateFULservice1 (service-type-1)
这会给你15个复制品。使用5节点群集时,Service Fabric将默认均匀分配内容,因此您将在每个节点上看到3个副本。在共享主机进程模型中,每个节点上的3个副本将共享主机进程。在该主机进程内,每个副本都是您的类的实例,派生自StatefulService
。马上,你可以看到这会变得多么复杂。我们使用C#构造来表示副本 - 每个副本都是一个C#对象。这意味着他们共享流程,地址空间,一切。如果其中一个副本抛出一个未处理的异常并导致进程崩溃,那么其他副本就会崩溃。而忘记使用静态变量!
现在让我们假设您创建一个service-type-2
实例,实例数为-1:
fabric:/myapp/mystateLESSservice1
因为这是一种不同的服务类型,它将获得自己的主机进程,与我们创建的第一个服务分开 - 它必须,因为它实际上运行不同的代码/ DLL。这个是无状态的,因此对于这个服务实例(fabric:/ myapp / mystateLESSservice1),每个节点只能获得一个副本。
现在,如果您创建另一个 service-type-2
实例,同时实例计数= -1:
fabric:/myapp/mystateLESSservice2
这是相同的服务类型,因此服务实例将使用已经为该类型的先前实例启动的主机进程,因为它们正在运行相同的代码/ DLL。这类似于我们在有状态示例中看到的内容 - 每个服务实例实际上只是一个派生自StatelessService
的类的实例,这当然也存在同样的问题。
最后,如果您创建一个全新的应用程序实例:
fabric:/myapp2
您可以为该应用程序中的所有内容获取全新的流程集。因此,应用程序实例总是进程边界。
tl; dr:使用独家流程。