Modelli di progettazione per le applicazioni SaaS multi-tenant e Ricerca di AzureDesign patterns for multitenant SaaS applications and Azure Search

Un'applicazione multi-tenant è un'applicazione che fornisce gli stessi servizi e funzionalità a un numero qualsiasi di tenant che non possono vedere o condividere i dati di nessun altro tenant.A multitenant application is one that provides the same services and capabilities to any number of tenants who cannot see or share the data of any other tenant. Questo documento illustra le strategie di isolamento dei tenant per le applicazioni multi-tenant compilate con Ricerca di Azure.This document discusses tenant isolation strategies for multitenant applications built with Azure Search.

Concetti di Ricerca di AzureAzure Search concepts

Come soluzione di ricerca come servizio, Ricerca di Azure consente agli sviluppatori di aggiungere esperienze di ricerca avanzate alle applicazioni, senza dover gestire un'infrastruttura o diventare esperti in recupero delle informazioni.As a search-as-a-service solution, Azure Search allows developers to add rich search experiences to applications without managing any infrastructure or becoming an expert in information retrieval. I dati vengano caricati nel servizio e quindi archiviati nel cloud.Data is uploaded to the service and then stored in the cloud. Tramite semplici richieste all'API di Ricerca di Azure, i dati possono essere modificati e ricercati.Using simple requests to the Azure Search API, the data can then be modified and searched. Una panoramica del servizio è riportata in questo articolo.An overview of the service can be found in this article. Prima di esaminare i modelli di progettazione, è importante comprendere alcuni concetti di Ricerca di Azure.Before discussing design patterns, it is important to understand some concepts in Azure Search.

Servizi di ricerca, indici, campi e documentiSearch services, indexes, fields, and documents

Quando si usa Ricerca di Azure, si sottoscrive un servizio di ricerca.When using Azure Search, one subscribes to a search service. Quando i dati vengono caricati in Ricerca di Azure, vengono archiviati in un indice all'interno del servizio di ricerca.As data is uploaded to Azure Search, it is stored in an index within the search service. In un solo servizio possono essere presenti molti indici.There can be a number of indexes within a single service. Facendo riferimento ai familiari concetti relativi ai database, il servizio di ricerca può essere paragonato a un database, mentre gli indici all'interno di un servizio possono essere paragonati alle tabelle di un database.To use the familiar concepts of databases, the search service can be likened to a database while the indexes within a service can be likened to tables within a database.

Ogni indice all'interno di un servizio di ricerca ha un proprio schema, definito da un certo numero di campipersonalizzabili.Each index within a search service has its own schema, which is defined by a number of customizable fields. I dati vengono aggiunti a un indice di Ricerca di Azure sotto forma di singoli documenti.Data is added to an Azure Search index in the form of individual documents. Ogni documento deve essere caricato in un indice specifico e deve adattarsi allo schema di tale indice.Each document must be uploaded to a particular index and must fit that index's schema. Quando si eseguono ricerche di dati tramite Ricerca di Azure, vengono eseguite query di ricerca full-text su un particolare indice.When searching data using Azure Search, the full-text search queries are issued against a particular index. Facendo riferimento ai database, i campi possono essere paragonati alle colonne e i documenti alle righe di una tabella del database.To compare these concepts to those of a database, fields can be likened to columns in a table and documents can be likened to rows.

ScalabilitàScalability

Qualsiasi servizio di Ricerca di Azure nel piano tariffario Standard può essere ridimensionato in due sensi: archiviazione e disponibilità.Any Azure Search service in the Standard pricing tier can scale in two dimensions: storage and availability.

  • partizioni per aumentare lo spazio di archiviazione di un servizio di ricerca.Partitions can be added to increase the storage of a search service.
  • repliche a un servizio per aumentare la velocità effettiva delle richieste che un servizio di ricerca può gestire.Replicas can be added to a service to increase the throughput of requests that a search service can handle.

Aggiungendo e rimuovendo partizioni e repliche si consentirà alla capacità del servizio di ricerca di crescere in base alla quantità di dati e al traffico richiesti dall'applicazione.Adding and removing partitions and replicas at will allow the capacity of the search service to grow with the amount of data and traffic the application demands. Affinché un servizio di ricerca rispetti un contratto di serviziodi lettura, sono necessarie due repliche.In order for a search service to achieve a read SLA, it requires two replicas. Affinché un servizio rispetti un contratto di serviziodi lettura-scrittura, sono necessarie tre repliche.In order for a service to achieve a read-write SLA, it requires three replicas.

Esistono vari piani tariffari per Ricerca di Azure, ciascuno dei quali presenta quote e limiti differenti.There are a few different pricing tiers in Azure Search, each of the tiers has different limits and quotas. Alcuni di questi limiti sono a livello di servizio, altri sono a livello di indice e altri ancora a livello di partizione.Some of these limits are at the service-level, some are at the index-level, and some are at the partition-level.

BasicBasic Standard1Standard1 Standard2Standard2 Standard3Standard3 Standard3 HDStandard3 HD
Massimo numero di repliche per servizioMaximum Replicas per Service 33 1212 1212 1212 1212
Massimo numero di partizioni per servizioMaximum Partitions per Service 11 1212 1212 1212 33
Massimo numero di unità di ricerca (repliche * partizioni) per servizioMaximum Search Units (Replicas*Partitions) per Service 33 3636 3636 3636 36 (max 3 partizioni)36 (max 3 partitions)
Massimo numero di documenti per servizioMaximum Documents per Service 1 milione1 million 180 milioni180 million 720 milioni720 million 1,4 miliardi1.4 billion 600 milioni600 million
Massimo spazio di archiviazione per servizioMaximum Storage per Service 2 GB2 GB 300 GB300 GB 1,2 TB1.2 TB 2,4 TB2.4 TB 600 GB600 GB
Massimo numero di documenti per partizioneMaximum Documents per Partition 1 milione1 million 15 milioni15 million 60 milioni60 million 120 milioni120 million 200 milioni200 million
Massimo spazio di archiviazione per partizioneMaximum Storage per Partition 2 GB2 GB 25 GB25 GB 100 GB100 GB 200 GB200 GB 200 GB200 GB
Massimo numero di indici per servizioMaximum Indexes per Service 55 5050 200200 200200 3000 (max 1000 indici/partizione)3000 (max 1000 indexes/partition)

S3 ad alta densitàS3 High Density'

Nel piano tariffario S3 di Ricerca di Azure è disponibile un'opzione per la modalità a densità elevata (HD) progettata specificamente per gli scenari multi-tenant.In Azure Search’s S3 pricing tier, there is an option for the High Density (HD) mode designed specifically for multitenant scenarios. In molti casi è necessario supportare un numero elevato di tenant più piccoli in un singolo servizio, per ottenere vantaggi come semplicità e convenienza.In many cases, it is necessary to support a large number of smaller tenants under a single service to achieve the benefits of simplicity and cost efficiency.

S3 HD consente di comprimere numerosi indici di piccole dimensioni, che vengono quindi gestiti da un singolo servizio di ricerca, sacrificando la possibilità di aumentare il numero di indici che usano le partizioni in cambio dell'hosting di un maggior numero di indici in un singolo servizio.S3 HD allows for the many small indexes to be packed under the management of a single search service by trading the ability to scale out indexes using partitions for the ability to host more indexes in a single service.

In pratica, un servizio S3 potrebbe avere fino a 200 indici che insieme potrebbero ospitare fino a 1,4 miliardi di documenti.Concretely, an S3 service could have between 1 and 200 indexes that together could host up to 1.4 billion documents. D'altro canto S3 HD consentirebbe ai singoli indici di arrivare solo fino a un milione di documenti, tuttavia può gestire fino a 1000 indici per partizione (fino a 3000 per ogni servizio) con un numero totale di documenti pari a 200 milioni per partizione (fino a 600 milioni per ogni servizio).An S3 HD on the other hand would allow individual indexes to only go up to 1 million documents, but it can handle up to 1000 indexes per partition (up to 3000 per service) with a total document count of 200 million per partition (up to 600 million per service).

Considerazioni per le applicazioni multi-tenantConsiderations for multitenant applications

Le applicazioni multi-tenant devono distribuire in modo efficace le risorse tra i tenant mantenendo al tempo stesso un certo livello di privacy tra i vari tenant.Multitenant applications must effectively distribute resources among the tenants while preserving some level of privacy between the various tenants. Quando si progetta l'architettura di un'applicazione di questo tipo, ci sono alcuni aspetti da considerare:There are a few considerations when designing the architecture for such an application:

  • Isolamento del tenant: gli sviluppatori di applicazioni devono adottare misure appropriate per assicurarsi che nessun tenant non autorizzato o indesiderato acceda ai dati di altri tenant.Tenant isolation: Application developers need to take appropriate measures to ensure that no tenants have unauthorized or unwanted access to the data of other tenants. Oltre alla questione della privacy dei dati, le strategie di isolamento tenant richiedono una gestione efficace delle risorse condivise e la protezione da vicini fastidiosi.Beyond the perspective of data privacy, tenant isolation strategies require effective management of shared resources and protection from noisy neighbors.
  • Costi delle risorse del cloud: come con qualsiasi altra applicazione, le soluzioni software devono rimanere competitive quando sono componenti di un'applicazione multi-tenant.Cloud resource cost: As with any other application, software solutions must remain cost competitive as a component of a multitenant application.
  • Semplicità delle operazioni: quando si sviluppa un'architettura multi-tenant, l'impatto sulle operazioni e la complessità dell'applicazione è un fattore importante.Ease of Operations: When developing a multitenant architecture, the impact on the application's operations and complexity is an important consideration. Ricerca di Azure ha un contratto di servizio del 99,9%.Azure Search has a 99.9% SLA.
  • Presenza globale: le applicazioni multi-tenant potrebbero dover gestire in modo efficace tenant distribuiti in tutto il mondo.Global footprint: Multitenant applications may need to effectively serve tenants which are distributed across the globe.
  • Scalabilità: gli sviluppatori di applicazioni devono mantenere le applicazioni a un livello di complessità sufficientemente ridotto e allo stesso tempo progettarle in maniera che siano scalabili in base al numero di tenant e alla dimensione dei dati e del carico di lavoro dei tenant.Scalability: Application developers need to consider how they reconcile between maintaining a sufficiently low level of application complexity and designing the application to scale with number of tenants and the size of tenants' data and workload.

Ricerca di Azure offre alcuni confini che consentono di isolare i dati e il carico di lavoro dei tenant.Azure Search offers a few boundaries that can be used to isolate tenants’ data and workload.

Nel caso di uno scenario multi-tenant, lo sviluppatore dell'applicazione usa uno o più servizi di ricerca e divide i tenant tra i servizi, gli indici o entrambi.In the case of a multitenant scenario, the application developer consumes one or more search services and divide their tenants among services, indexes, or both. Ricerca di Azure dispone di alcuni modelli comuni per la modellazione di uno scenario multi-tenant:Azure Search has a few common patterns when modeling a multitenant scenario:

  1. Indice per tenant: ogni tenant dispone di un proprio indice all'interno di un servizio di ricerca che è condiviso con altri tenant.Index per tenant: Each tenant has its own index within a search service that is shared with other tenants.
  2. Servizio per tenant: ogni tenant dispone di un proprio servizio Ricerca di Azure dedicato, il che offre un livello più elevato di separazione dei dati e del carico di lavoro.Service per tenant: Each tenant has its own dedicated Azure Search service, offering highest level of data and workload separation.
  3. Combinazione di entrambi: ai tenant più grandi e attivi vengono assegnati servizi dedicati mentre ai tenant più piccoli vengono assegnati singoli indici all'interno di servizi condivisi.Mix of both: Larger, more-active tenants are assigned dedicated services while smaller tenants are assigned individual indexes within shared services.

1. Indice per tenant1. Index per tenant

Un'immagine del modello "indice per tenant"

In un modello "indice per tenant", più tenant occupano un singolo servizio di Ricerca di Azure in cui ogni tenant dispone di un proprio indice.In an index-per-tenant model, multiple tenants occupy a single Azure Search service where each tenant has their own index.

I tenant ottengono l'isolamento dei dati perché tutte le richieste di ricerca e le operazioni sui documenti sono emesse a livello di indice in Ricerca di Azure.Tenants achieve data isolation because all search requests and document operations are issued at an index level in Azure Search. Nel livello dell'applicazione c'è la necessità di indirizzare il traffico dei diversi tenant agli indici corretti gestendo al tempo stesso le risorse a livello di servizio tra tutti i tenant.In the application layer, there is the need awareness to direct the various tenants’ traffic to the proper indexes while also managing resources at the service level across all tenants.

Una caratteristica importante del modello "indice per tenant" è la possibilità per lo sviluppatore di applicazioni di eseguire l'oversubscription della capacità di un servizio di ricerca tra i tenant dell'applicazione.A key attribute of the index-per-tenant model is the ability for the application developer to oversubscribe the capacity of a search service among the application’s tenants. Se la distribuzione del carico di lavoro fra i tenant non è uniforme, è possibile distribuire una combinazione ottimale di tenant tra gli indici di un servizio di ricerca in modo da sistemare un certo numero di tenant molto attivi e che richiedono molte risorse, servendo al tempo stesso una lunga coda di tenant meno attivi.If the tenants have an uneven distribution of workload, the optimal combination of tenants can be distributed across a search service’s indexes to accommodate a number of highly active, resource-intensive tenants while simultaneously serving a long tail of less active tenants. Lo svantaggio del modello è la sua incapacità di gestire le situazioni in cui tutti i tenant sono simultaneamente molto attivi.The trade-off is the inability of the model to handle situations where each tenant is concurrently highly active.

Il modello "indice per tenant" costituisce la base per un modello di costo variabile, in cui un intero servizio di Ricerca di Azure viene prima acquistato e poi completato con i tenant.The index-per-tenant model provides the basis for a variable cost model, where an entire Azure Search service is bought up-front and then subsequently filled with tenants. In questo modo la capacità inutilizzata può essere destinata ad account di prova e gratuiti.This allows for unused capacity to be designated for trials and free accounts.

Per le applicazioni con una presenza globale, il modello "indice per tenant" potrebbe non essere il più efficiente.For applications with a global footprint, the index-per-tenant model may not be the most efficient. Se i tenant di un'applicazione vengono distribuiti in tutto il mondo, potrebbe essere necessario un servizio diverso per ogni area, il che potrebbe duplicare i costi per ognuno di essi.If an application's tenants are distributed across the globe, a separate service may be necessary for each region which may duplicate costs across each of them.

Ricerca di Azure consente il ridimensionamento verso l'alto dei singoli indici e anche l'incremento del numero totale di indici.Azure Search allows for the scale of both the individual indexes and the total number of indexes to grow. Se viene scelto un piano tariffario appropriato, possono essere aggiunte partizioni e repliche all'intero servizio di ricerca quando un singolo indice all'interno del servizio diventa troppo grande in termini di archiviazione o traffico.If an appropriate pricing tier is chosen, partitions and replicas can be added to the entire search service when an individual index within the service grows too large in terms of storage or traffic.

Se il numero totale di indici diventa troppo grande per un singolo servizio, è necessario eseguire il provisioning di un altro servizio per accogliere i nuovi tenant.If the total number of indexes grows too large for a single service, another service has to be provisioned to accommodate the new tenants. Se è necessario spostare determinati indici tra i servizi di ricerca quando vengono aggiunti nuovi servizi, i dati dell'indice devono essere copiati manualmente da un indice all'altro in quanto Ricerca di Azure non consente di spostare un indice.If indexes have to be moved between search services as new services are added, the data from the index has to be manually copied from one index to the other as Azure Search does not allow for an index to be moved.

2. Servizio per tenant2. Service per tenant

Un'immagine del modello "servizio per tenant"

In un'architettura "servizio per tenant" ogni tenant dispone di un proprio servizio di ricerca.In a service-per-tenant architecture, each tenant has its own search service.

In questo modello l'applicazione ottiene il massimo livello di isolamento per i suoi tenant.In this model, the application achieves the maximum level of isolation for its tenants. Ogni servizio ha risorse di archiviazione e velocità effettiva dedicate per la gestione delle richiesta di ricerca nonché chiavi API diverse.Each service has dedicated storage and throughput for handling search request as well as separate API keys.

Per le applicazioni in cui ogni tenant ha grandi dimensioni o il carico di lavoro è poco variabile da un tenant all'altro, il modello "servizio per tenant" è una scelta efficace in quanto le risorse non sono condivise tra i carichi di lavoro dei diversi tenant.For applications where each tenant has a large footprint or the workload has little variability from tenant to tenant, the service-per-tenant model is an effective choice as resources are not shared across various tenants’ workloads.

Un modello "servizio per tenant" offre inoltre il vantaggio della stimabilità dei costi fissi.A service per tenant model also offers the benefit of a predictable, fixed cost model. Non è necessario alcun investimento iniziale in un intero servizio di ricerca fino a quando non c'è un tenant che lo occupa, tuttavia il costo per tenant è superiore rispetto al modello "indice per tenant".There is no up-front investment in an entire search service until there is a tenant to fill it, however the cost-per-tenant is higher than an index-per-tenant model.

Il modello "servizio per tenant" è una scelta efficiente per le applicazioni con una presenza globale.The service-per-tenant model is an efficient choice for applications with a global footprint. Con i tenant distribuiti geograficamente è facile avere il servizio di ciascun tenant nell'area appropriata.With geographically-distributed tenants, it is easy to have each tenant's service in the appropriate region.

Problematiche di scalabilità di questo modello si verificano quando i singoli tenant diventano troppo grandi per il servizio.The challenges in scaling this pattern arise when individual tenants outgrow their service. Ricerca di Azure attualmente non supporta l'aggiornamento del piano tariffario di un servizio di ricerca, pertanto tutti i dati dovranno essere copiati manualmente in un nuovo servizio.Azure Search does not currently support upgrading the pricing tier of a search service, so all data would have to be manually copied to a new service.

3. Valutazione di entrambi i modelli3. Mixing both models

Un'altra possibilità per la modellazione multi-tenancy consiste nell'unione delle due strategie "indice per tenant" e "servizio per tenant".Another pattern for modeling multitenancy is mixing both index-per-tenant and service-per-tenant strategies.

Combinando i due modelli, i tenant più grandi di un'applicazione possono occupare servizi dedicati mentre la lunga coda di tenant più piccoli e meno attivi può occupare gli indici in un servizio condiviso.By mixing the two patterns, an application's largest tenants can occupy dedicated services while the long tail of less active, smaller tenants can occupy indexes in a shared service. Questo modello garantisce ai tenant più grandi di ottenere prestazioni elevate e coerenti dal servizio, contribuendo al tempo stesso a proteggere i tenant più piccoli da eventuali vicini fastidiosi.This model ensures that the largest tenants have consistently high performance from the service while helping to protect the smaller tenants from any noisy neighbors.

L'implementazione di questa strategia si basa tuttavia sulla previsione di quali tenant richiederanno un servizio dedicato e non un indice in un servizio condiviso.However, implementing this strategy relies foresight in predicting which tenants will require a dedicated service versus an index in a shared service. La complessità dell'applicazione aumenta con la necessità di gestire entrambi questi modelli multi-tenancy.Application complexity increases with the need to manage both of these multitenancy models.

Raggiungimento di una granularità ancora maggioreAchieving even finer granularity

I modelli di progettazione descritti sopra per la modellazione di scenari multi-tenant in Ricerca di Azure si basano sul presupposto di un ambito uniforme in cui ogni tenant è un'istanza completa di un'applicazione.The above design patterns to model multitenant scenarios in Azure Search assume a uniform scope where each tenant is a whole instance of an application. Le applicazioni tuttavia possono gestire a volte numerosi ambiti più piccoli.However, applications can sometimes handle many smaller scopes.

Se i modelli "servizio per tenant" e "indice per tenant" non hanno un ambito sufficientemente piccolo, è possibile modellare un indice per ottenere un livello di granularità ancora più preciso.If service-per-tenant and index-per-tenant models are not sufficiently small scopes, it is possible to model an index to achieve an even finer degree of granularity.

Per ottenere che un singolo indice si comporti in modo diverso per endpoint del client diversi, è possibile aggiungere un campo a un indice che stabilisce un determinato valore per ogni possibile client.To have a single index behave differently for different client endpoints, a field can be added to an index which designates a certain value for each possible client. Ogni volta che un client chiama Ricerca di Azure per eseguire una query o modificare un indice, il codice dall'applicazione client specifica il valore appropriato per quel campo mediante la funzionalità di filtro di Ricerca di Azure in fase di query.Each time a client calls Azure Search to query or modify an index, the code from the client application specifies the appropriate value for that field using Azure Search's filter capability at query time.

Questo metodo può essere usato per ottenere funzionalità di account utente diversi, livelli di autorizzazione diversi e persino applicazioni completamente diverse.This method can be used to achieve functionality of separate user accounts, separate permission levels, and even completely separate applications.

Nota

L'uso dell'approccio descritto sopra per configurare un singolo indice per più tenant influisce sulla pertinenza dei risultati della ricerca.Using the approach described above to configure a single index to serve multiple tenants affects the relevance of search results. I punteggi di pertinenza della ricerca vengono calcolati a livello di indice, non a livello di tenant, quindi tutti i dati dei tenant vengono incorporati nelle statistiche dei punteggi di pertinenza, ad esempio la frequenza del termine.Search relevance scores are computed at an index-level scope, not a tenant-level scope, so all tenants' data is incorporated in the relevance scores' underlying statistics such as term frequency.

Passaggi successiviNext steps

Ricerca di Azure è una scelta interessante per molte applicazioni: altre informazioni sulle affidabili funzionalità del servizio sono disponibili qui.Azure Search is a compelling choice for many applications, read more about the service's robust capabilities. Quando si valutano i vari modelli di progettazione per le applicazioni multi-tenant, è opportuno considerare i vari piani tariffari e i rispettivi limiti del servizio per adattare al meglio Ricerca di Azure ad architettura o carichi di lavoro applicativi di tutte le dimensioni.When evaluating the various design patterns for multitenant applications, consider the various pricing tiers and the respective service limits to best tailor Azure Search to fit application workloads and architectures of all sizes.

Le domande su Ricerca di Azure e sugli scenari multi-tenant possono essere indirizzate ad azuresearch_contact@microsoft.com.Any questions about Azure Search and multitenant scenarios can be directed to azuresearch_contact@microsoft.com.