2016-03-02 2 views
6

Ho un servizio ASP.NET Core (RC1) senza stato in esecuzione nel mio cluster Azure Service Fabric. Presenta il seguente manifest:Perché non è possibile modificare i vincoli di posizionamento in un aggiornamento?

<ServiceManifest Name="MyServicePkg" Version="1.0.2" ...> 
    <ServiceTypes> 
     <StatelessServiceType ServiceTypeName="MyServiceType" /> 
    </ServiceTypes> 
    ... 
</ServiceManifest> 

Il mio cluster è configurato con proprietà di posizionamento. Ho 5 server con "nodeType = Backend" e 3 server con "nodeType = Frontend".

Desidero aggiornare il mio servizio e specificare che può essere inserito solo nei nodi "back-end". Questo è il mio manifesto aggiornato:

<ServiceManifest Name="MyServicePkg" Version="1.0.3" ...> 
    <ServiceTypes> 
     <StatelessServiceType ServiceTypeName="MyServiceType"> 
      <PlacementConstraints>(nodeType==Backend)</PlacementConstraints> 
     </StatelessServiceType> 
    </ServiceTypes> 
    ... 
</ServiceManifest> 

Tuttavia, se ora eseguo l'aggiornamento, ottengo il seguente errore:

Start-ServiceFabricApplicationUpgrade : Default service descriptions must not be modified as part of upgrade. Modified default service: fabric:/MyApp/MyService

Perché non è possibile modificare i vincoli con un aggiornamento?

Devo eliminare e ricreare il servizio? Ciò mi sembrerebbe estremamente problematico perché comporterebbe tempi di inattività e perdita di dati per servizi di stato.

risposta

5

C'è in realtà un modo abbastanza semplice per farlo senza dover scrivere un po 'di codice per definire manualmente l'applicazione sul fabric cluster.

Mentre è possibile dichiarare i vincoli di posizionamento nel manifest del servizio, è anche possibile dichiararli nel manifest dell'applicazione. Qualsiasi cosa dichiarata nel manifest dell'applicazione annullerà ciò che è presente nel manifest del servizio. E con l'impostazione nel manifest dell'applicazione, è possibile utilizzare i parametri per modificare i valori in base al file di parametri che si desidera implementare.

Ho appena scritto a blog post that discusses this approach in greater detail. Spero che lo trovi utile :)

+1

Questo è fantastico e mi rende incredibilmente felice! Grazie per aver condiviso questo !!! Questo dovrebbe essere sicuramente documentato nei documenti ufficiali. –

6

Quindi il problema qui è in realtà con la parte DefaultService di ApplicationManifest. Quando i servizi vengono creati come parte di DefaultService, ci sono cose che non puoi cambiare in seguito. Potresti essere in grado di cambiarlo tramite l'esploratore di ServiceFabric, ma non ne sono sicuro.

Una raccomandazione sarebbe quella di mantenere i DefaultServices vuoti in ApplicationManifest e creare invece i servizi manualmente. Con manuale intendo sia tramite PowerShell, codice o ServiceFabric Explorer. Questo ti dà più flessibilità sul cambiare parti del servizio in seguito. Quando è fatto in quel modo, tu sai che hai la possibilità di cambiare le cose come i vincoli di posizionamento dopo che il servizio è in esecuzione.

Per creare servizi con PowerShell è possibile utilizzare il comando New-ServiceFabricService. Per crearlo dal codice, è possibile utilizzare FabricClient per farlo. Un esempio di questo può essere trovato qui: Azure Service Fabric Multi-Tenancy

+1

Grazie per la risposta. Questo sembra essere un enorme svantaggio dal momento che questa è l'impostazione predefinita in Visual Studio e tutti la useranno in questo modo. Avete alcuni collegamenti/ulteriori informazioni su come creare i servizi manualmente? –