2016-02-06 13 views
5

Sto cercando di ottenere un po 'di follow-up a questa domanda che è già stato risposto ...Azure Servizio tessuto multi-tenancy

Service Fabric multi-tenant

Se dovessi configurazione miei inquilini come Azure Fabric Servizio Stateless Servizi (otterranno il loro stato fuori banda), come posso inserire più di un titolare su ciascun nodo nel cluster? Nei test, sembra che Service Fabric gags se si tenta di rendere il conteggio delle istanze maggiore del conteggio dei nodi.

Questi tenant sono molto leggeri, quindi dovrei essere in grado di eseguirne decine su ciascun nodo (ne avremo centinaia in totale) e non voglio dover fare un nodo per ognuno. Nello specifico, gli inquilini sono più o meno semplicemente aprendo una connessione HTTP a polling lungo a un servizio clienti esterno e riversando tali dati nel nostro sistema - quindi non ci sono endpoint pubblici in gioco qui. Ho solo bisogno della capacità di far girare un sacco di questi lavoratori, ognuno dei quali aprirà la propria connessione a lungo termine.

Qualcuno può indicarmi la giusta direzione?

FYI, ho spiegato un po 'di più qui ... https://social.msdn.microsoft.com/Forums/en-US/efd172e2-0783-489b-b3ab-ec62fb7b8ee4/multiple-instances-per-node?forum=AzureServiceFabric

Grazie in anticipo!

risposta

7

Avrete bisogno in qualche modo di partizionare il vostro servizio.

Ci sono diversi opzioni, ma i due che si allinea bene qui (e anche con il SO domanda si è collegato sono):

dispone di un'applicazione SF dove ogni inquilino riceve un'istanza del vostro servizio. Sarà quindi necessario disporre di un servizio condiviso di fronte per indirizzare le richieste al servizio corretto. Dovrebbe assomigliare a qualcosa di simile a questo.

MyAwesomeApp 
    SharedStatelessApi <- External API points here 
    MyTenantService_Tenant1 <- ServiceType: MyTenantService 
    MyTenantService_Tenant2 <- ServiceType: MyTenantService 
    ... 

L'altra soluzione è quella di avere una (o più) di servizi applicativi tessuto al locatario, e apparirebbe qualcosa sulla falsariga di:

MySharedApp 
    SharedStatelessApi <- External API points here 
Tenant1 <- ApplicationType: MyTenantApp 
    MyTenantService <- ServiceType: MyTenantService 
Tenant2 <- ApplicationType: MyTenantApp 
    MyTenantService <- ServiceType: MyTenantService 

E 'lo stesso concetto come il primo esempio, ma la partizione viene eseguita su una leva più alta.

Personalmente, preferisco il secondo caso. Sembra più giusto. In entrambi i casi, dovrai creare manualmente i servizi/l'applicazione quando un nuovo cliente si iscrive o lo fa in codice. Se vuoi farlo in codice, dovresti dare un'occhiata a FabricClient. Se hai bisogno di un esempio, fammi sapere.

Inoltre, come si può vedere, è necessario disporre di un endpoint pubblico condiviso e in tale endpoint indirizzare la richiesta al servizio corretto in base a qualcosa (intestazione, token di autenticazione, uri, qualsiasi cosa sia in linea con l'app).

Esempio di utilizzo FabricClient per creare un servizio:

In primo luogo è necessario un FabricClient.Per un cluster non garantito (cluster dev locale), il seguente è sufficiente:

var fabricClient = new FabricClient("localhost:19000"); 

Quando è stato distribuito a un cluster protetta (per esempio in Azure), è necessario autenticare il FabricClient, in questo modo:

var creds = new X509Credentials 
{ 
    FindType = X509FindType.FindByThumbprint, 
    FindValue = clientCertThumbprint, 
    RemoteCertThumbprints = {clientCertThumbprint}, 
    StoreLocation = StoreLocation.LocalMachine, 
    StoreName = "My" 
}; 

var clusterEndpoint = "CLUSTERNAME.LOCATION.cloudapp.azure.com:19000" 
// or whatever your cluster endpoint is 

var fabricClient = new FabricClient(creds, clusterEndpoint); 

Poi, quando si ha un FabricClient, è possibile creare un servizio senza stato come questo:

var statelessDescriptor = new StatelessServiceDescription 
{ 
    ApplicationName = new Uri("fabric:/MYAPP"), 
    InstanceCount = 1, // How many instances. 
    PartitionSchemeDescription = new SingletonPartitionSchemeDescription(), 
    ServiceName = new Uri("fabric:/MYAPP/TenantA"), 
    ServiceTypeName = "YourServiceTypeName", 
    InitializationData = DATA_TO_PASS_TO_SERVICE_BYTE[] // Only if needed. 
}; 

await _client.ServiceManager.CreateServiceAsync(statelessDescriptor) 

Se avete passato tutti i dati nella prop "InitializationData", sarà dispo lable in servizio come ServiceInitializationParameters.InitializationData

+0

Grazie per il tempo dedicato a fornire un feedback. Forse ho bisogno di fare ulteriori ricerche su FabricClient e sulla soluzione che stai proponendo di capire se è parte della risposta che sto cercando. Tieni presente che il nostro servizio multi-tenant è in realtà solo un processo per l'apertura di una connessione HTTP a polling lungo e lo streaming di dati dai clienti, nessun endpoint pubblico. Il problema è che abbiamo bisogno di eseguire più istanze, vale la pena di questi tenant su ciascun nodo poiché sono molto leggeri e non ha senso utilizzarne uno per nodo, il che non sfrutterebbe completamente la potenza del nodo. – cwiederspan

+0

Ho riformulato parte della mia domanda per chiarire meglio il carico di lavoro sottostante nella speranza che ciò renderà il problema meglio definito. Fondamentalmente cercando di costruire un esercito di connessioni HTTP a lungo polling che possono essere eseguite per lunghi periodi di tempo e failover, bilanciamento del carico, ecc. Usando Service Fabric. – cwiederspan

+0

Ok, supponendo che tu abbia un modo interno di attivare l'avvio della connessione, il mio post qui sopra rimane valido. Ad esempio, invece di attivare una connessione al Tenant A, ruoti un'istanza del tuo servizio stateless per il Tenant A e quel servizio apre la sua connessione nel suo metodo RunAsync. Ha senso ? – anderso