Multi tenancy o multiistanza?

8

Sto provando a costruire una soluzione SaaS basata sul web e ho imboccato una strada in cui non sono sicuro di usare multi tenancy o multi instance. Cercherò di descrivere quello che sto cercando di ottenere, e ogni approccio vantaggi e svantaggi (secondo me, secondo ciò che ho letto). Per favore includi i tuoi suggerimenti nel caso in cui mi sia sfuggito qualcosa in un approccio rispetto all'altro.

L'applicazione che sto cercando di costruire è, come ho detto, una soluzione SaaS in cui le aziende possono creare i loro account e ogni account / azienda ha i propri utenti, clienti, prodotti, servizi ... ecc. Ogni utente; chi è un dipendente della società; relativo a un account / azienda avrà accesso solo ai suoi clienti, prodotti e servizi. Le aziende potrebbero avere un numero illimitato di clienti, prodotti e servizi, quindi ogni azienda dovrebbe avere il proprio data center.

Per questo motivo ho deciso di creare un database condiviso (salvando tutte le credenziali degli utenti a scopo di accesso) e uno schema condiviso di più database (database per account / azienda). Fondamentalmente, Multi Tenancy .

Poi qualcuno ha suggerito di utilizzare Istanza multipla , invece, dove ogni azienda avrà la propria istanza dell'applicazione (es. codice, librerie, database, framework ... ecc.) completamente separata dalle altre società . Questo suona meglio in quanto non devo occuparmi di un ulteriore livello in cui ho bisogno di assicurarmi che gli utenti di ciascun inquilino abbiano accesso solo ai dati della loro azienda. Penso che sia opportuno menzionare che sto seguendo Docker per raggiungere questo approccio (non ho mai usato prima), ma penso che manchi di funzionalità (più su quelle successive) di cui avrò bisogno in futuro (almeno non le ho trovate con un po 'di ricerca).

Tuttavia, ogni approccio ha pro e contro, quindi non ho potuto decidere con quale approccio andare. Ecco una lista, ma nuda con me perché mi manca la conoscenza di entrambi, quindi potrebbe esserci qualcosa di cui non sono a conoscenza, o una soluzione per un problema che non ho trovato sul web: [Ogni approccio ha un elenco ordinato di cui ho seguito un confronto uno per uno]

Multi Tenancy :

  1. Host condiviso / hardware, codice condiviso e multi database.
  2. È più semplice estendere la funzionalità del codice e correggere i bug (codice condiviso).
  3. È più difficile estendere l'hardware (potrebbe utilizzare un servizio cloud) o spostare il database del singolo titolare su un altro sistema senza apportare modifiche al codice.
  4. Ancora più importante, come ho detto prima, ho bisogno di aggiungere un ulteriore livello al sistema per assicurarmi che l'utente appartenga effettivamente alla sua azienda e non acceda alle informazioni di altre società.

Istanza multipla :

  1. Host / hardware condiviso o non condiviso, codice per istanza e database per istanza.
  2. È più difficile estendere la funzionalità o correggere i bug (non sono sicuro che ci sia un modo per farlo in Docker dove è possibile aggiungere funzionalità / funzionalità a un'istanza o contenitore Docker e distribuirlo agli altri).
  3. È più semplice spostare l'intera istanza su un host / hardware diverso.
  4. Come istanza, non ho bisogno di occuparmi di quel livello dato che ogni istanza avrà il proprio database.

Tutti i vantaggi e gli svantaggi sono ridondanti nel caso in cui voglio fare qualcosa manualmente (come creare un'istanza per ogni inquilino manualmente), ed è per questo che dubito della soluzione Docker, a meno che non ci sia un modo per risolverlo, che è forse la ragione principale della domanda. Gradirei se rispondessi alla domanda con riferimenti alle soluzioni e perché pensi che questo approccio sia migliore dell'altro.

Nel caso in cui ciò sarebbe di aiuto (forse?), stiamo utilizzando Laravel come framework principale per il back-end (tutto RESTfully) .

    
posta Anas 28.12.2015 - 13:56
fonte

2 risposte

6

Mi sto ponendo esattamente la stessa domanda al momento.

Mi sto appoggiando alla soluzione multi-istanza singola di locazione ma non ho ancora preso una decisione definitiva. Lasciatemi condividere alcuni dei miei pensieri:

Il principale vantaggio storico dell'architettura multi-tenant è un utilizzo migliore delle risorse dell'infrastruttura , mediante mutualizzazione (singolo sistema operativo, singolo database, singolo livello applicativo) e migliore occupando dette risorse (quando un utente è assente un altro può utilizzare la stessa risorsa).

Inoltre, semplifica il ciclo di vita del software : distribuisci nuove versioni a una sola istanza, tutti i clienti vengono aggiornati contemporaneamente.

Sembra tuttavia che i recenti progressi nella tecnologia cloud rendano la prima classe di vantaggi ampiamente disponibile in un'architettura multi-istanza (istanza per cliente) (penso in particolare a una piattaforma come Jelastic qui, ma sono sicuro che lì sono altri che forniscono le stesse funzionalità):

  • PaaS basato su container
  • Provisioning e ridimensionamento automatico dei contenitori (contenitori elastici)

Quindi la gestione dell'hardware e della piattaforma non è più la preoccupazione del fornitore di software. Le risorse sono mutuate in modo molto più efficiente rispetto a prima ai livelli dell'infrastruttura e della piattaforma .

Ci sarà ancora un sovraccarico per multi-istanza (alcune app e middleware verranno eseguiti N volte invece di una sola), ma molto inferiori rispetto a quando si utilizza una macchina (virtuale) separata per istanza. Il database può essere comunque condiviso (uno schema per istanza, diversi schemi per server DB)

Inoltre:

  • L'automazione della creazione di nuove istanze è possibile tramite l'API PaaS
  • L'automazione della distribuzione di nuove versioni è possibile tramite l'API PaaS, con tempi di fermo zero (richiede un po 'di lavoro da mettere in atto)
  • Il ridimensionamento è sempre attivo, mai attivo. Non dobbiamo preoccuparci di set di dati enormi a livello di istanza.

Naturalmente, avremmo bisogno di un qualche tipo di servizio centrale che gestisca tutto questo automaticamente (ad es. creazione di istanza quando un nuovo utente crea un account). Ciò gestirà anche i problemi di pagamento e di licenza, l'interazione tra le istanze, ecc. Questo servizio centrale potrebbe essere piuttosto complesso e difficile da sviluppare, ma la cosa buona è che non dobbiamo implementarlo in anticipo (ora che non abbiamo molto risorsa) mentre il multi-tenant dovrebbe essere inserito nell'app dall'inizio.

Il che mi porta agli ultimi vantaggi dello sviluppo di un progetto di single-tenant per uno stadio iniziale (pre-investimento):

  • La stessa (o quasi) versione dell'app può essere implementata on-premises come appliance virtuale o contenitore docker o anche su macchina gestita dal cliente (alcune aziende sono ancora riluttanti verso il Cloud e potrebbe aiutare una startup in fase iniziale a non escludere importanti early adopter)
  • Più veloce per ottenere un prodotto con risorse limitate (il livello dell'applicazione e lo schema del database sono molto meno complessi), è possibile ottenere un prodotto single-tenant single-instance monouso (MVP) per i primi utenti e mostra il valore commerciale dell'app ai potenziali investitori e aggiungi tutta l'automazione del cloud in un secondo momento
  • Può essere considerato un argomento di vendita per i clienti preoccupati per la sicurezza dei dati: i dati sono meglio incapsulati poiché ogni cliente ha il proprio schema o addirittura un database. Molto meno rischio di "spandimento"

NB: sto ovviamente pensando a un'app aziendale in cui i clienti sarebbero aziende (ciascuna con più utenti individuali) e non individui. Non avrebbe senso eseguire un'istanza separata di un'app per ogni singolo utente (o sarebbe?)

    
risposta data 08.01.2016 - 16:02
fonte
4

È anche possibile supportare entrambe le opzioni (un pool di titolari su più istanze).

Io preferisco la causa multi-istanza dell'isolamento naturale. L'istanza di ogni cliente viene eseguita nei propri processi e i dati sono isolati nel proprio database. Se lo desideri, puoi aggiornare le istanze alle nuove versioni per cliente / istanza.

I sistemi basati sui titolari presentano un rischio per la sicurezza delle informazioni. Basta considerare quanto sia facile dimenticare una clausola "WHERE tenantId = x". Il motivo principale per utilizzare un sistema con tenant in grado di essere prestazioni, i processi sono di peso elevato, condividendo un processo si può potenzialmente ottenere di più da una macchina. Questo era più vero in un mondo a 32 bit, quindi oggi è su macchine a 64 bit che hanno molta più RAM.

Un sistema a più istanze potrebbe richiedere un po 'più di strumenti per creare e configurare l'ambiente come database e istanze di applicazioni web. Si può sostenere che è necessario avere questo script anche per le distribuzioni a istanza singola. Questo ha anche altri vantaggi, come la possibilità di configurare ambienti di sviluppo e test

Lascerò le funzionalità del titolare fino a quando non ne avremo il motivo (costo di ingegneria e denaro risparmiato su infrastruttura (hardware) attraverso la condivisione dei processi).

    
risposta data 28.12.2015 - 17:12
fonte