Implementazione della multitenancy mediante gli spazi dei nomi

L'API Namespaces consente di abilitare facilmente la multitenancy nell'applicazione, semplicemente selezionando una stringa dello spazio dei nomi per ogni tenant nell'utilizzo del pacchetto.

Impostazione dello spazio dei nomi attuale

Puoi ottenere, impostare e convalidare gli spazi dei nomi utilizzando . Il gestore dello spazio dei nomi consente di impostare uno spazio dei nomi attuale per le API abilitate per lo spazio dei nomi. Puoi impostare preventivamente uno spazio dei nomi attuale utilizzando e il datastore e memcache lo utilizzeranno automaticamente.

La maggior parte degli sviluppatori di App Engine utilizzerà il proprio dominio Google Workspace (in precedenza G Suite) come spazio dei nomi attuale. Google Workspace consente di eseguire il deployment dell'app in qualsiasi dominio di tua proprietà, quindi puoi utilizzare questo meccanismo facilmente per configurare spazi dei nomi diversi per domini diversi. Poi puoi usare questi spazi dei nomi distinti per separare i dati tra i domini. Per ulteriori informazioni, consulta la sezione Mappatura di domini personalizzati.

Il seguente esempio di codice mostra come impostare lo spazio dei nomi attuale 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.

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. In modo più esplicito, 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'utilizzo da parte del sistema. Questa regola dello spazio dei nomi di sistema non viene applicata, ma potresti riscontrare facilmente conseguenze negative non definite se non la segui.

Evitare le fughe di dati

Uno dei rischi comunemente associati alle app multitenant è il pericolo che i dati vengano divulgati negli spazi dei nomi. Le fughe di dati non intenzionali possono derivare da molte origini, tra cui:

  • Utilizzo degli spazi dei nomi con le API App Engine che non supportano ancora gli spazi dei nomi. Ad esempio, Blobstore non supporta gli spazi dei nomi. Se utilizzi spazi dei nomi con BLOB, devi evitare di utilizzare query dell'archivio BLOB per le richieste degli utenti finali o chiavi dell'archivio BLOB provenienti da fonti non attendibili.
  • Utilizzare un supporto di archiviazione esterno (anziché memcache e datastore), tramite URL Fetch o altri meccanismi, 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 è consigliabile che tutti gli indirizzi email di un dominio accedano a uno spazio dei nomi. L'uso del dominio email impedisce inoltre all'applicazione di utilizzare uno spazio dei nomi finché l'utente non esegue l'accesso.

Deployment degli spazi dei nomi

Le seguenti sezioni descrivono come eseguire il deployment degli spazi dei nomi con altri strumenti e API di App Engine.

Creazione di spazi dei nomi in base all'utente

Alcune applicazioni devono creare spazi dei nomi in base all'utente. Se vuoi suddividere i dati a livello di utente per gli utenti che hanno eseguito l'accesso, puoi utilizzare user.Current(c).ID, che restituisce un ID univoco e permanente per l'utente. Il seguente esempio di codice mostra come utilizzare l'API Users per 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 detta la pagina di destinazione da mostrare a un utente.

Utilizzo degli spazi dei nomi con Datastore

Per impostazione predefinita, il datastore utilizza lo spazio dei nomi attuale per le richieste del datastore. L'API applica questo spazio dei nomi attuale agli oggetti datastore.Key al momento della creazione. Pertanto, devi fare attenzione se un'applicazione archivia Key oggetti in moduli serializzati, poiché lo spazio dei nomi viene conservato in tali serializzazioni.

Se utilizzi oggetti Key deserializzati, assicurati che si comportino come previsto. La maggior parte delle applicazioni semplici che utilizzano il datastore (put/query/get) senza utilizzare altri meccanismi di archiviazione funzionerà come previsto impostando lo spazio dei nomi attuale prima di chiamare un'API del datastore.

Gli oggetti Query e Key dimostrano i seguenti comportamenti univoci in merito agli spazi dei nomi:

  • Al momento della creazione, gli oggetti Query e Key ereditano lo spazio dei nomi attuale, a meno che non imposti uno spazio dei nomi esplicito.
  • Quando un'applicazione crea un nuovo Key da un predecessore, il nuovo Key eredita lo spazio dei nomi del predecessore.

Utilizzo degli spazi dei nomi con Memcache

Per impostazione predefinita, memcache utilizza lo spazio dei nomi attuale del gestore dello spazio dei nomi per le richieste memcache. Nella maggior parte dei casi, non è necessario impostare esplicitamente uno spazio dei nomi nella memcache e questo potrebbe comportare bug imprevisti.

Tuttavia, ci sono alcune istanze univoche in cui è appropriato impostare esplicitamente uno spazio dei nomi nella memcache. Ad esempio, la tua applicazione potrebbe avere dati comuni condivisi tra tutti gli spazi dei nomi (ad esempio una tabella contenente i codici paese).

Il seguente snippet di codice mostra come impostare esplicitamente lo spazio dei nomi nella memcache:

Utilizzo degli spazi dei nomi con la coda di attività

Per impostazione predefinita, le code push utilizzano lo spazio dei nomi attuale impostato nel gestore dello spazio 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 questo potrebbe comportare bug imprevisti.

I nomi delle attività sono condivisi tra 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 dell'attività per molti spazi dei nomi, puoi semplicemente aggiungere ognuno di essi al nome dell'attività.

Quando una nuova attività chiama il metodo della coda di attività, quest'ultima copia lo spazio dei nomi attuale e, se applicabile, il dominio Google Workspace dal gestore dello spazio dei nomi. Quando viene eseguita l'attività, lo spazio dei nomi attuale e quello di Google Workspace vengono ripristinati.

Ci sono alcune istanze univoche in cui è appropriato 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 sull'utilizzo in tutti gli spazi dei nomi. Puoi quindi impostare esplicitamente lo spazio dei nomi dell'attività. Il seguente esempio di codice mostra come impostare esplicitamente gli spazi dei nomi con la coda di attività.

Utilizzo degli spazi dei nomi con Blobstore

L'archivio BLOB non è segmentato per spazio dei nomi. Per conservare uno spazio dei nomi in Blobstore, devi accedere a Blobstore tramite un supporto di archiviazione che conosca lo spazio dei nomi (attualmente solo memcache, datastore e coda di attività). Ad esempio, se il Key di un blob è archiviato in un'entità datastore, puoi accedervi con un datastore Key che conosca lo spazio dei nomi.

Se l'applicazione accede a Blobstore tramite chiavi archiviate in uno spazio di archiviazione sensibile allo spazio dei nomi, non è necessario segmentare il Blobstore per spazio dei nomi. Le applicazioni devono evitare perdite di blob tra gli spazi dei nomi:

  • Non utilizzare BlobInfo per 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 il suo utilizzo per le richieste degli utenti finali potrebbe causare fughe di dati perché tutti i record BlobInfo non sono compartimentati per spazio dei nomi.
  • Non vengono utilizzate chiavi di archivio BLOB di fonti non attendibili.

Impostazione degli spazi dei nomi per le query Datastore

Nella console Google Cloud puoi impostare lo spazio dei nomi per le query Datastore.

Se non vuoi utilizzare quello predefinito, seleziona dal menu a discesa quello che vuoi utilizzare.

Utilizzo degli spazi dei nomi con il caricatore collettivo

Il caricatore collettivo supporta un flag --namespace=NAMESPACE che consente di specificare lo spazio dei nomi da utilizzare. Ogni spazio dei nomi viene gestito separatamente e, se vuoi accedere a tutti, dovrai ripetere l'iterazione.