不Azure的服务织物为每个服务创建单独的进程

Pra*_*tic 1 azure-service-fabric

假设在Azure服务矩阵上运行了一个命名应用程序。而这个指定的应用程序有5个不同的服务。

这些服务将在不同的进程中运行还是在相同的进程中运行?如果这些服务不是.net服务而是可执行文件,该怎么办?

Vac*_*cek 6

来宾EXE总是拥有自己的进程。

否则,有两种可用的托管模式:

独家流程 -这个过程非常简单,因此让我们从这里开始。在这种模式下,一切都有自己的过程。每个应用程序的每个服务实例的每个分区的每个副本都有其自己的独占主机进程。这是我推荐的托管模式,因为它是最简单的托管模式,通常可以带来更高的稳定性和更容易调试的服务。

共享过程 -这变得更加复杂。在应用程序实例中,相同服务类型的所有内容共享一个主机进程。因此,例如,假设您有一个应用程序:

fabric:/myapp
Run Code Online (Sandbox Code Playgroud)

在该应用程序中,您有两种服务类型:

service-type-1 (stateful)
service-type-2 (stateless)
Run Code Online (Sandbox Code Playgroud)

现在,假设您创建一个实例,该实例service-type-1具有5个分区,每个分区3个副本:

fabric:/myapp/mystateFULservice1    (service-type-1)
Run Code Online (Sandbox Code Playgroud)

这将为您提供15个副本。对于具有5个节点的群集,默认情况下,Service Fabric将平均分配内容,因此您将在每个节点上看到3个副本。在共享主机进程模型中,每个节点上的3个副本将共享一个主机进程。在该宿主进程内,每个副本都是从派生的类的实例StatefulService。马上,您将看到如何变得复杂。我们使用C#构造来表示副本-每个副本都是一个C#对象。这意味着他们共享一个进程,地址空间以及所有内容。如果这些副本之一抛出未处理的异常并导致进程崩溃,其他副本就会失败。忘记使用静态变量!

现在,假设您创建service-type-2一个实例计数为-1的实例:

fabric:/myapp/mystateLESSservice1
Run Code Online (Sandbox Code Playgroud)

由于这是一种不同的服务类型,因此它将获得自己的宿主进程,与我们创建的第一个服务不同-它必须这样做,因为它实际上是在运行不同的代码/ DLL。这个是无状态的,因此对于该服务实例(fabric:/ myapp / mystateLESSservice1),每个节点只能得到一个副本。

现在,如果您创建的另一个实例service-type-2,实例计数也= -1:

fabric:/myapp/mystateLESSservice2
Run Code Online (Sandbox Code Playgroud)

这是相同的服务类型,因此该服务实例将使用该类型的先前实例已经启用的主机进程,因为它们正在运行相同的代码/ DLL。这类似于我们在有状态示例中看到的内容-每个服务实例实际上只是从中派生的类的实例StatelessService,并且当然也存在所有相同的问题。

最后,如果您创建一个全新的应用程序实例

fabric:/myapp2
Run Code Online (Sandbox Code Playgroud)

您为该应用程序中的所有内容获得了一套全新的过程。因此,应用程序实例始终是进程边界。

tl; dr:使用互斥过程。