L'API Namespaces ti consente di attivare facilmente il multitenancy nella tua applicazione semplicemente selezionando una stringa dello spazio dei nomi per ogni tenant
in web.xml
utilizzando il pacchetto NamespaceManager.
Impostazione dello spazio dei nomi attuale
Puoi ottenere, impostare e convalidare gli spazi dei nomi
utilizzando il pacchetto NamespaceManager.
Il gestore
dello spazio dei nomi ti consente di impostare uno spazio dei nomi corrente per le API abilitate per lo spazio dei nomi. Imposti uno spazio dei nomi corrente in anticipo
in web.xml
e Datastore e memcache utilizzano automaticamente questo spazio dei nomi.
La maggior parte degli sviluppatori di App Engine utilizzerà il proprio dominio Google Workspace (precedentemente G Suite) come spazio dei nomi corrente. Google Workspace ti consente di eseguire il deployment della tua app in qualsiasi dominio di tua proprietà, in modo da poter utilizzare facilmente questo meccanismo per configurare spazi dei nomi diversi per domini diversi. Poi, puoi utilizzare questi spazi dei nomi separati per separare i dati nei vari domini. Per ulteriori informazioni, vedi Mappatura di domini personalizzati.
Il seguente esempio di codice mostra come impostare lo spazio dei nomi corrente sul dominio Google Workspace utilizzato per mappare l'URL. In particolare, questa stringa sarà la stessa per tutti gli URL mappati tramite lo stesso dominio Google Workspace.
Puoi impostare gli spazi dei nomi in Java utilizzando l'interfaccia del filtro servlet prima di richiamare i metodi servlet. Il seguente esempio di codice mostra come utilizzare il tuo dominio Google Workspace come spazio dei nomi corrente:
Il filtro dello spazio dei nomi deve essere configurato nel file web.xml. Tieni presente che, se sono presenti più voci di filtro, verrà utilizzato il primo spazio dei nomi impostato.
Il seguente esempio di codice mostra come configurare il filtro dello spazio dei nomi in web.xml:
web.xml e sul mapping dei percorsi URL ai servlet, consulta The Deployment Descriptor: web.xml.
Puoi anche impostare un nuovo spazio dei nomi per un'operazione temporanea, reimpostando lo spazio dei nomi originale al termine dell'operazione, utilizzando il pattern try/finally mostrato di seguito:
Se non specifichi un valore per namespace, lo spazio dei nomi viene impostato su una stringa vuota. La stringa namespace è arbitraria, ma è anche limitata a un massimo di 100 caratteri alfanumerici, punti, trattini bassi e trattini. Più precisamente, le stringhe dello spazio dei nomi devono corrispondere all'espressione regolare [0-9A-Za-z._-]{0,100}.
Per convenzione, tutti gli spazi dei nomi che iniziano con "_" (trattino basso) sono riservati all'uso di sistema. Questa regola dello spazio dei nomi di sistema non viene applicata, ma potresti facilmente riscontrare conseguenze negative non definite se non la rispetti.
Evitare le fughe di dati
Uno dei rischi comunemente associati alle app multitenant è il pericolo che i dati vengano divulgati tra gli spazi dei nomi. Le fughe di dati non intenzionali possono verificarsi da molte fonti, tra cui:
- Utilizzo di spazi dei nomi con API App Engine che non supportano ancora gli spazi dei nomi. Ad esempio, Blobstore non supporta gli spazi dei nomi. Se utilizzi gli spazi dei nomi con Blobstore, devi evitare di utilizzare query Blobstore per le richieste degli utenti finali o chiavi Blobstore da origini non attendibili.
- Utilizzo di un supporto di archiviazione esterno (anziché memcache e Datastore), tramite
URL Fetcho un altro meccanismo, senza fornire uno schema di compartimentazione per gli spazi dei nomi. - Impostazione di uno spazio dei nomi in base al dominio email di un utente. Nella maggior parte dei casi, non vuoi che tutti gli indirizzi email di un dominio accedano a uno spazio dei nomi. L'utilizzo del dominio email impedisce inoltre alla tua applicazione di utilizzare uno spazio dei nomi finché l'utente non ha eseguito l'accesso.
Deployment degli spazi dei nomi
Le sezioni seguenti descrivono come eseguire il deployment degli spazi dei nomi con altri strumenti e API App Engine.
Creazione di spazi dei nomi per utente
Alcune applicazioni devono creare spazi dei nomi in base all'utente. Se vuoi compartimentare i dati a livello di utente per gli utenti che hanno eseguito l'accesso, valuta la possibilità di utilizzare
User.getUserId()
, che restituisce un ID univoco e permanente per l'utente. Il seguente esempio di codice mostra come utilizzare l'API Users a questo scopo:
In genere, le app che creano spazi dei nomi in base all'utente forniscono anche pagine di destinazione specifiche a utenti diversi. In questi casi, l'applicazione deve fornire uno schema URL che determini quale pagina di destinazione mostrare a un utente.
Utilizzo degli spazi dei nomi con Datastore
Per impostazione predefinita, Datastore utilizza l'impostazione dello spazio dei nomi corrente nel gestore dello spazio dei nomi per le richieste Datastore. L'API applica questo spazio dei nomi corrente agli oggetti
Key o Query
quando vengono creati. Pertanto, devi prestare attenzione se un'applicazione archivia oggetti Key o Query in forme serializzate, poiché lo spazio dei nomi viene conservato in queste serializzazioni.
Se utilizzi oggetti Key e Query deserializzati, assicurati che funzionino come previsto. La maggior parte delle applicazioni semplici che utilizzano Datastore (put/query/get) senza utilizzare altri meccanismi di archiviazione funzionerà come previsto impostando lo spazio dei nomi corrente prima di chiamare qualsiasi API Datastore.
Gli oggetti Query e Key mostrano i seguenti comportamenti univoci in relazione agli spazi dei nomi:
- Gli oggetti
QueryeKeyereditano lo spazio dei nomi corrente al momento della creazione, a meno che non ne imposti uno esplicito. - Quando un'applicazione crea un nuovo
Keyda un elemento principale, il nuovoKeyeredita lo spazio dei nomi dell'elemento principale. - Non esiste un'API per Java per impostare esplicitamente lo spazio dei nomi di un
Keyo di unQuery.
SomeRequest per incrementare il conteggio per lo spazio dei nomi corrente e lo spazio dei nomi denominato arbitrariamente -global- in un'entità datastore Counter.
Utilizzo degli spazi dei nomi con Memcache
Per impostazione predefinita, memcache utilizza lo spazio dei nomi corrente di Namespace Manager per le richieste memcache. Nella maggior parte dei casi, non è necessario impostare esplicitamente uno spazio dei nomi nella memcache e questa operazione potrebbe introdurre bug imprevisti.
Tuttavia, esistono alcuni casi unici in cui è opportuno impostare esplicitamente uno spazio dei nomi nella memcache. Ad esempio, la tua applicazione potrebbe avere dati comuni condivisi in tutti gli spazi dei nomi (ad esempio una tabella contenente i codici paese).
Il seguente snippet di codice mostra come impostare in modo esplicito lo spazio dei nomi nella memcache:Per impostazione predefinita, l'API memcache per Java esegue query sul gestore dello spazio dei nomi per lo spazio dei nomi corrente da MemcacheService. Puoi anche dichiarare esplicitamente uno
spazio dei nomi quando crei la memcache utilizzando getMemcacheService(Namespace).
Per la maggior parte delle applicazioni, non è necessario specificare esplicitamente uno spazio dei nomi.
Il seguente esempio di codice mostra come creare una memcache che utilizza lo spazio dei nomi corrente nel gestore degli spazi dei nomi.
Questo esempio di codice specifica in modo esplicito uno spazio dei nomi durante la creazione di un servizio memcache:
Utilizzo degli spazi dei nomi con la coda di attività
Per impostazione predefinita, le code push utilizzano lo spazio dei nomi corrente impostato in Gestione spazi dei nomi al momento della creazione dell'attività. Nella maggior parte dei casi, non è necessario impostare esplicitamente uno spazio dei nomi nella coda di attività e questa operazione potrebbe introdurre bug imprevisti.
I nomi delle attività vengono condivisi in tutti gli spazi dei nomi. Non puoi creare due attività con lo stesso nome, anche se utilizzano spazi dei nomi diversi. Se vuoi utilizzare lo stesso nome di attività per molti spazi dei nomi, puoi semplicemente aggiungere ogni spazio dei nomi al nome dell'attività.
Quando una nuova attività chiama la coda di attività
add()
, la coda di attività copia lo spazio dei nomi corrente e (se applicabile) il dominio Google Workspace dal gestore dello spazio dei nomi. Quando l'attività viene eseguita, vengono ripristinati lo spazio dei nomi corrente e lo spazio dei nomi Google Workspace.
Se lo spazio dei nomi corrente non è impostato nella richiesta di origine (in altre parole, se get() restituisce null), la coda di attività imposta lo spazio dei nomi su "" nelle attività eseguite.
Esistono alcuni casi unici in cui è opportuno impostare esplicitamente uno spazio dei nomi per un'attività che funziona in tutti gli spazi dei nomi. Ad esempio, puoi creare un'attività che aggrega le statistiche di utilizzo in tutti gli spazi dei nomi. A questo punto, puoi impostare esplicitamente lo spazio dei nomi dell'attività.
Per prima cosa, crea un gestore di coda di attività che incrementi il conteggio in un'entità datastore Counter:
e,
Poi, crea attività con una servlet:
Utilizzo degli spazi dei nomi con Blobstore
Blobstore non è segmentato per spazio dei nomi. Per conservare uno spazio dei nomi in Blobstore, devi accedere a Blobstore tramite un supporto di archiviazione che riconosce lo spazio dei nomi (attualmente solo memcache, Datastore e coda di attività). Ad esempio, se Key di un blob è archiviato in un'entità Datastore, puoi accedervi con un Key o Query di Datastore che riconosce lo spazio dei nomi.
Se l'applicazione accede a Blobstore tramite chiavi archiviate in uno spazio di archiviazione sensibile allo spazio dei nomi, Blobstore stesso non deve essere segmentato per spazio dei nomi. Le applicazioni devono evitare perdite di blob tra spazi dei nomi:
- Non utilizza
com.google.appengine.api.blobstore.BlobInfoFactoryper le richieste degli utenti finali. Puoi utilizzare le query BlobInfo per le richieste amministrative (ad esempio per generare report su tutti i blob delle applicazioni), ma utilizzarle per le richieste degli utenti finali potrebbe comportare perdite di dati perché tutti i record BlobInfo non sono suddivisi per spazio dei nomi. - Non utilizzare chiavi Blobstore provenienti da fonti non attendibili.
Impostazione degli spazi dei nomi per le query Datastore
Nella Google Cloud console, puoi impostare lo spazio dei nomi per le query Datastore.
Se non vuoi utilizzare quello predefinito, seleziona lo spazio dei nomi che vuoi utilizzare dal menu a discesa.
Utilizzo degli spazi dei nomi con Bulk Loader
Il caricatore collettivo supporta un flag --namespace=NAMESPACE che ti consente di specificare lo spazio dei nomi da utilizzare. Ogni spazio dei nomi viene gestito separatamente e, se vuoi accedere a tutti gli spazi dei nomi, devi iterarli.
Utilizzare gli spazi dei nomi con la ricerca
Una nuova istanza di Index eredita lo spazio dei nomi di SearchService utilizzato per crearla. Una volta creato un riferimento a un indice, il relativo spazio dei nomi non può essere modificato. Esistono due modi per impostare lo spazio dei nomi per un SearchService prima di utilizzarlo per creare un indice:
- Per impostazione predefinita, un nuovo
SearchServiceprende lo spazio dei nomi corrente. Puoi impostare lo spazio dei nomi corrente prima di creare il servizio:
- Puoi specificare uno spazio dei nomi in
SearchServiceConfigquando crei un servizio: