Service Fabric:ServiceManifest.xml 是否允许多种服务类型
Service Fabric: are multiple service types allowed in ServiceManifest.xml
我正在尝试在单个 exe (ServiceRuntime.RegisterServiceAsync) 中注册多个 service-fabric 服务。这受支持吗?如果是这样,我将如何配置它们?
例如:ServiceManifest.xml 支持 ServiceTypes 中的多个 StatelessServiceType 元素:
<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="EchoGatewayPkg"
Version="1.0.0"
xmlns="http://schemas.microsoft.com/2011/01/fabric"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ServiceTypes>
<StatelessServiceType ServiceTypeName="Service1Type" >
</StatelessServiceType>
<StatelessServiceType ServiceTypeName="Service2Type" >
</StatelessServiceType>
</ServiceTypes>
...
和ApplicationManifest.xml不支持DefaultServices/Service内的多个StatelessService元素:
<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="EchoServiceType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
<Parameters>
<Parameter Name="Service1_InstanceCount" DefaultValue="1" />
<Parameter Name="Service2_InstanceCount" DefaultValue="1" />
</Parameters>
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="MyServicePkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
</ServiceManifestImport>
<DefaultServices>
<Service Name="MyService1">
<StatelessService ServiceTypeName="Service1Type" InstanceCount="[Service1_InstanceCount]">
<SingletonPartition />
</StatelessService>
</Service>
<Service Name="MyService2">
<StatelessService ServiceTypeName="Service2Type" InstanceCount="[Service2_InstanceCount]">
<SingletonPartition />
</StatelessService>
</Service>
</DefaultServices>
</ApplicationManifest>
因此,这实际上产生了 2 个进程,并且每个进程的激活上下文都列出了两种默认服务类型(我本以为只有一个具有此配置)。
欢迎提出任何建议(关于如何在单个 exe 中配置多种服务类型)或澄清。
暂时忽略默认服务..
是,就是这样让多个服务类型共享一个宿主进程。您会看到 2 个进程,因为 Service Fabric 将这两个服务实例放置在不同的节点上,并且每个实例都需要一个主机进程。尝试使用 InstanceCount="-1" 创建每个服务以查看这两种类型共享主机进程。
好的,回到默认服务。这本质上是令人困惑的,因为应用程序清单和服务清单仅用于描述 type 信息,而不是 instance 信息。但是为了在创建应用程序实例时默认创建服务实例,您必须以声明方式指定实例及其参数。因此,您在示例中的默认服务下看到的是 XML 等同于:
PS > New-ServiceFabricService -Stateless -PartitionSchemeSingleton -InstanceCount 1 -ApplicationName fabric:/EchoService -ServiceName fabric:/EchoService/MyService1 -ServiceTypeName Service1Type
PS > New-ServiceFabricService -Stateless -PartitionSchemeSingleton -InstanceCount 1 -ApplicationName fabric:/EchoService -ServiceName fabric:/EchoService/MyService2 -ServiceTypeName Service2Type
因此,在 Service 元素中使用多个 StatelessService 元素没有意义,因为您正在定义要创建的服务 instances,以及服务实例的类型和版本。
为了后代,这是您发布的服务清单附带的注册码:
internal static class Program
{
private static void Main()
{
try
{
ServiceRuntime.RegisterServiceAsync("Service1Type",
context => new Stateless1(context)).GetAwaiter().GetResult();
ServiceRuntime.RegisterServiceAsync("Service2Type",
context => new Stateless2(context)).GetAwaiter().GetResult();
Thread.Sleep(Timeout.Infinite);
}
catch (Exception e)
{
ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
throw;
}
}
}
}
我正在尝试在单个 exe (ServiceRuntime.RegisterServiceAsync) 中注册多个 service-fabric 服务。这受支持吗?如果是这样,我将如何配置它们?
例如:ServiceManifest.xml 支持 ServiceTypes 中的多个 StatelessServiceType 元素:
<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="EchoGatewayPkg"
Version="1.0.0"
xmlns="http://schemas.microsoft.com/2011/01/fabric"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ServiceTypes>
<StatelessServiceType ServiceTypeName="Service1Type" >
</StatelessServiceType>
<StatelessServiceType ServiceTypeName="Service2Type" >
</StatelessServiceType>
</ServiceTypes>
...
和ApplicationManifest.xml不支持DefaultServices/Service内的多个StatelessService元素:
<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="EchoServiceType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
<Parameters>
<Parameter Name="Service1_InstanceCount" DefaultValue="1" />
<Parameter Name="Service2_InstanceCount" DefaultValue="1" />
</Parameters>
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="MyServicePkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
</ServiceManifestImport>
<DefaultServices>
<Service Name="MyService1">
<StatelessService ServiceTypeName="Service1Type" InstanceCount="[Service1_InstanceCount]">
<SingletonPartition />
</StatelessService>
</Service>
<Service Name="MyService2">
<StatelessService ServiceTypeName="Service2Type" InstanceCount="[Service2_InstanceCount]">
<SingletonPartition />
</StatelessService>
</Service>
</DefaultServices>
</ApplicationManifest>
因此,这实际上产生了 2 个进程,并且每个进程的激活上下文都列出了两种默认服务类型(我本以为只有一个具有此配置)。
欢迎提出任何建议(关于如何在单个 exe 中配置多种服务类型)或澄清。
暂时忽略默认服务..
是,就是这样让多个服务类型共享一个宿主进程。您会看到 2 个进程,因为 Service Fabric 将这两个服务实例放置在不同的节点上,并且每个实例都需要一个主机进程。尝试使用 InstanceCount="-1" 创建每个服务以查看这两种类型共享主机进程。
好的,回到默认服务。这本质上是令人困惑的,因为应用程序清单和服务清单仅用于描述 type 信息,而不是 instance 信息。但是为了在创建应用程序实例时默认创建服务实例,您必须以声明方式指定实例及其参数。因此,您在示例中的默认服务下看到的是 XML 等同于:
PS > New-ServiceFabricService -Stateless -PartitionSchemeSingleton -InstanceCount 1 -ApplicationName fabric:/EchoService -ServiceName fabric:/EchoService/MyService1 -ServiceTypeName Service1Type
PS > New-ServiceFabricService -Stateless -PartitionSchemeSingleton -InstanceCount 1 -ApplicationName fabric:/EchoService -ServiceName fabric:/EchoService/MyService2 -ServiceTypeName Service2Type
因此,在 Service 元素中使用多个 StatelessService 元素没有意义,因为您正在定义要创建的服务 instances,以及服务实例的类型和版本。
为了后代,这是您发布的服务清单附带的注册码:
internal static class Program
{
private static void Main()
{
try
{
ServiceRuntime.RegisterServiceAsync("Service1Type",
context => new Stateless1(context)).GetAwaiter().GetResult();
ServiceRuntime.RegisterServiceAsync("Service2Type",
context => new Stateless2(context)).GetAwaiter().GetResult();
Thread.Sleep(Timeout.Infinite);
}
catch (Exception e)
{
ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
throw;
}
}
}
}