Un'architettura di dati multi-tenant

1

Siamo in una pianificazione & riprogettare la fase della nostra applicazione per la carta fedeltà. Come si capisce, sarà un'applicazione multi-tenant. E ho bisogno di prendere i tuoi pensieri. Ecco alcuni punti chiave che dovremmo prendere in considerazione per ridisegnare la struttura dei dati logici e fisici:

  1. Campagne: possiamo organizzare campagne di tenant cross come se la comprassi dal locatario A, puoi acquistarla dal tenant B con lo sconto del 10%.

  2. Gerarchia dei titolari: dal punto di vista della sicurezza, i rami degli inquilini possono vedere solo le loro transazioni, non l'altro ramo o inquilino.

  3. La personalizzazione per gli inquilini sarà rara da ignorare: consideriamo la personalizzazione solo sui dati del titolare della carta (almeno non avremo la possibilità di effettuare personalizzazioni per base di inquilini nei prossimi uno o due anni).

  4. Titolare della carta (non un utente inquilino, anche noi possiamo accedere per amministrare e segnalare tutti gli inquilini) può accedere al sistema per vedere la transazione che ha fatto.

In generale sono d'accordo con l'idea di separare il db dell'affittuario o il sharding a un certo livello. Dal momento che abbiamo i criteri numero 1, ci richiede di interrogare tutti i dbs per decidere se la sua transazione è stata girata o meno in una campagna. Potrebbe essere un enorme problema di prestazioni. O cosa ne pensi di sharding, fa davvero problemi di prestazioni? Inoltre, cosa preferiresti se dovessi creare un sistema OLAP dovessi eseguire una query su db con più shar per scopi di reporting e decisionali?

D'altro canto, con la separazione dei db, i titolari più attivi avranno un maggiore guadagno di prestazioni dal sistema, specialmente durante l'assunzione di report. Perché i loro dati transazionali risiederanno nel proprio db e una query verrà eseguita. Potremmo allocare più risorse sul sistema e citare un prezzo significativo per il loro utilizzo dell'applicazione. Sharding sarà utile anche se consideriamo di collocare questa app su cloud perché sqlServer azzurro ha un limite di 10 GB per db.

Un'idea è quella di separare il db ma di mantenere un master db per le decisioni incrociate come le campagne ecc. (come quella menzionata qui nella parte di modifica della domanda). Ma tutti i rapporti saranno presi dai dbs che possedevano. Una seconda idea è la separazione di inquilini molto più attivi e la gestione degli altri mediante l'approccio tenantID nel master db. Infine, potremmo considerare nosql graph db per elaborare le transazioni sul server della campagna.

Useremo anche NHibernate per lo strumento ORM. Ma il progetto di sharding non è stato risolto e dovremmo prendere in considerazione l'implementazione di uno per noi per implementare un approccio db separato usando l'approccio shard o master db. Cosa ne pensi dell'utilizzo di nhibner nel servizio di gestione delle transazioni? Sarà una penalizzazione delle prestazioni utilizzando NHibernate in un servizio in tempo reale che dovrebbe consentire una risposta ad alta velocità? Se sì, cosa suggeriresti?

Modifica

@ rae1n Per essere più comprensibile sui miei determinati bisogni:

1 - Secondo il punto chiave sopra menzionato, quale architettura di dati suggeriresti?

  • Un db e TenantID per tabella, replicare il db quando necessario.

  • Uso di frammenti con la tabella principale.

  • Uso del mix di sharding e tenantID.

  • Il tuo suggerimento.

2 - NHibernate è adatto al tuo suggerimento per il # 1 e come? Potresti suggerire un'app campione o un link ad un articolo?

3 - NHibernate è adatto per il servizio di valutazione delle campagne. Si prega di tener conto che ci possono essere campagne molto complesse tra 1 e n inquilini e dovremmo sostenere questi comportamenti.

4- Consiglieresti nosql graph db per la valutazione della campagna e conosci un campione per tale utilizzo?

    
posta Community 20.02.2013 - 16:55
fonte

1 risposta

1

In primo luogo, suggerirò che potresti voler postare le domande di follow-up su dba.se. Le applicazioni multi-tenant sono difficili e diversi RDBMS hanno diversi strumenti per risolvere alcuni dei problemi. Senza sapere esattamente quale sia il tuo ambiente, le risposte specifiche sono spesso impossibili. Quindi vado a esaminare i problemi concettuali e ad esempio le risposte qui.

Per la personalizzazione dei dati dei titolari di carta, la mia raccomandazione è generalmente quella di archiviare i campi aggiuntivi in qualcosa di simile al formato XML o JSON perché questo fornisce una struttura di base per l'archiviazione che è flessibile e fornisce all'applicazione un modo per gestire i dati senza problemi. . Alcuni db potrebbero persino essere in grado di indicizzare i risultati della ricerca xpath rispetto ai record xml.

La sicurezza multi-tenant è una questione molto diversa ed è difficile. Lo standby tradizionale consiste nell'utilizzare una vista che può essere utilizzata per filtrare solo le righe autorizzate. Oracle ha alcuni modi per avviarli direttamente al tavolo. PostgreSQL ha alcuni modi per assicurarsi che le altre funzioni applicate non perdano informazioni.

Se questo diventa grande, sarà necessaria una sorta di divisione dello storage. Il modo in cui questo viene diviso dalle tabelle di partizionamento sarà qualcosa che dovrai decidere in base al carico di lavoro osservato. Se sei su Oracle, pensare di essere in grado di passare al RAC, se necessario, può essere utile, e se sei su PostgreSQL, Postgres-XC è la tecnologia da tenere a mente. Tuttavia, i tuoi requisiti attuali rendono un normale schema di sharding piuttosto discutibile e non è chiaro quali saranno i tuoi pattern di utilizzo. Quanti titolari di carte cross-tenant ci saranno? Quante domande di inquilini o titolari di carte di credito ci saranno? Queste sono le decisioni che dovrebbero essere prese quando diventano problemi e l'ottimizzazione prematura qui ti renderà difficile.

    
risposta data 25.02.2013 - 03:59
fonte

Leggi altre domande sui tag