2016-07-31 6 views
5

Ich versuche, mehrere Service-Fabric-Dienste innerhalb einer einzigen Exe (ServiceRuntime.RegisterServiceAsync) zu registrieren. Wird das unterstützt? Wenn ja, wie würde ich sie konfigurieren?Service Fabric: sind in ServiceManifest.xml mehrere Service-Typen erlaubt

ZB: unterstützt ServiceManifest.xml mehrere StatelessServiceType Elemente innerhalb ServiceTypes:

<?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> 
... 

und ApplicationManifest.xml unterstützt nicht mehrere StatelessService Elemente innerhalb DefaultServices/Service:

<?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> 

, daher ist diese effektiv Spawns 2 Prozesse, und der Aktivierungskontext jedes Prozesses hat beide Standard-Servicetypen aufgelistet (ich hätte nur einen mit dieser Konfiguration erwartet).

Alle Vorschläge (zum Konfigurieren mehrerer Servicetypen innerhalb einer einzelnen Exe) oder Erläuterungen sind willkommen.

+0

Wollen Sie wirklich, dies zu tun? Ich habe vor ein paar Monaten darüber nachgedacht, das selbst zu machen, aber dann habe ich mich an Micro-Services und Single-Responsibility erinnert, so dass jeder Service nun in seine eigene ausführbare Datei geht. –

Antwort

8

Standarddienste für eine zweite Ohne Berücksichtigung ..

Ja, das ist, wie Sie mehrere Service-Typen erhalten einen Host-Prozess zu teilen. Sie sehen zwei Prozesse, da Service Fabric diese beiden Service-Instanzen auf verschiedenen Knoten platziert und jeder einen Host-Prozess benötigt. Versuchen Sie, jeden Service mit InstanceCount = "- 1" zu erstellen, um die beiden Typen von Host-Prozessen zu sehen.

OK, zurück zu den Standarddiensten. Dies ist inhärent verwirrend, da das Anwendungsmanifest und das Servicemanifest nur Typ Informationen beschreiben sollen, nicht Instanz Informationen. Um Dienstinstanzen jedoch standardmäßig zu erstellen, wenn eine Anwendungsinstanz erstellt wird, müssen Sie die Instanzen und ihre Parameter deklarativ angeben. Also, was Sie unter Standarddienste dort in Ihrem Beispiel sehen, ist der XML-Äquivalent:

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 

So ist es nicht sinnvoll, mehr als ein StatelessService Element hat im Service-Elemente, da Sie den Dienst ist definiert, Instanzen Sie möchten zusammen mit dem Typ und der Version der Dienstinstanz erstellen.

Und nur für die Nachwelt, dann ist dies der Registrierungscode, der mit dem Service geht manifest Sie auf dem Laufenden:

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; 
     } 
    } 
} 
}