2016-07-31 28 views
5

में कई सेवा प्रकारों की अनुमति है I एक एकल exe (ServiceRuntime.RegisterServiceAsync) में एकाधिक सेवा-फ़ैब्रिक सेवाएं पंजीकृत करने का प्रयास कर रहा हूं। क्या यह समर्थित है? यदि हां, तो मैं उन्हें कैसे कॉन्फ़िगर करूँगा?सेवा फैब्रिक: ServiceManifest.xml

उदाहरण के लिए: 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/सेवा कई 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> 

इसलिए, यह प्रभावी रूप से spawns 2 प्रक्रियाएं, और प्रत्येक प्रक्रिया 'सक्रियण-संदर्भ में सूचीबद्ध दोनों डिफ़ॉल्ट सेवा प्रकार हैं (मुझे इस कॉन्फ़िगरेशन के साथ केवल एक ही उम्मीद होगी)।

कोई भी सुझाव (एक एकल exe के भीतर एकाधिक सेवा प्रकारों को कॉन्फ़िगर करने के तरीके पर) या स्पष्टीकरण का स्वागत है।

+0

क्या आप वाकई ऐसा करना चाहते हैं? मैंने कुछ महीने पहले इसे करने के बारे में सोचा था, लेकिन फिर सूक्ष्म सेवाओं और एक जिम्मेदारी को याद किया, इसलिए प्रत्येक सेवा अब अपने निष्पादन योग्य में जाती है। –

उत्तर

8

एक पल के लिए डिफ़ॉल्ट सेवाओं की अनदेखी ..

हाँ, यह है आप कैसे कई सेवा प्रकार एक मेजबान प्रक्रिया साझा करने के लिए मिलता है। आप 2 प्रक्रियाओं को देख रहे हैं क्योंकि सेवा फैब्रिक उन दो सेवा उदाहरणों को अलग-अलग नोड्स पर रख रहा है और प्रत्येक को मेजबान प्रक्रिया की आवश्यकता होती है। दो प्रकार के शेयर होस्ट प्रक्रियाओं को देखने के लिए InstanceCount = "- 1" के साथ प्रत्येक सेवा बनाने का प्रयास करें।

ठीक है, डिफ़ॉल्ट सेवाओं पर वापस। यह स्वाभाविक रूप से भ्रमित है क्योंकि एप्लिकेशन मेनिफेस्ट और सेवा मेनिफेस्ट केवल टाइप जानकारी का वर्णन करने के लिए है, उदाहरण जानकारी नहीं है। लेकिन जब अनुप्रयोग अनुप्रयोग बनाया जाता है तो डिफॉल्ट रूप से सेवा उदाहरण बनाने के लिए, आपको उदाहरणों और उनके पैरामीटर निर्दिष्ट करना होगा।

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 

तो यह समझ में सेवा तत्व में एक से अधिक StatelessService तत्व है करने के लिए नहीं है, क्योंकि आप सेवा को परिभाषित कर रहे हैं: तो क्या आप अपने उदाहरण में वहाँ डिफ़ॉल्ट सेवाओं के तहत देखने के एक्सएमएल बराबर है उदाहरण आप सेवा उदाहरण के प्रकार और संस्करण के साथ बनाना चाहते हैं।

और बस भावी पीढ़ी के लिए, यह पंजीकरण कोड है कि सेवा के साथ चला जाता है तुम्हें तैनात प्रकट है:

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; 
     } 
    } 
} 
} 
संबंधित मुद्दे