2010-07-21 15 views
5

Sto lavorando su un sistema che divide gli utenti per organizzazione. Ogni utente appartiene a un'organizzazione. Ogni organizzazione memorizza i propri dati nel proprio database che risiede su una macchina server di database. Un server db può gestire i database per 1 o più organizzazioni.Come "abilitare il web" un'applicazione legacy C++

Il sistema esistente (legacy) presuppone che ci sia una sola organizzazione, tuttavia voglio "scalare" l'applicazione eseguendone una "istanza" (legata a un'organizzazione) ed eseguire diverse istanze sulla macchina server (vale a dire eseguire più istanze dell'applicazione 'singola organizzazione' - un'istanza per ogni organizzazione).

Fornirò un'API RESTful per ogni istanza in esecuzione sul server, in modo che sia possibile utilizzare un thin client per accedere ai servizi forniti dall'istanza in esecuzione sul computer server.

Ecco un semplice schema che illustra le relazioni:

Server 1 -> database di N (ogni organizzazione ha un database)

organizzazione di 1 -> N utenti

La mia domanda riguarda come "indirizzare" le richieste RESTful da un client, all'istanza appropriata che gestisce le richieste degli utenti per quell'organizzazione.

In particolare, quando ricevo una richiesta RESTful, sarà da un utente (che appartiene a un'organizzazione), come (o in effetti, qual è il modo migliore) per "indirizzare" la richiesta all'istanza dell'applicazione appropriata in esecuzione sul server?

risposta

1

Da quello che posso raccogliere, questo è essenzialmente un problema di separazione. Indipendentemente dal modo in cui si suddividono le istanze a livello hardware (utilizzando VM, più server, tutto su un server potente, ecc.), È necessario un livello di registro e di broking centrale nell'architettura generale che associa gli utenti all'istanza di destinazione corretta per richiesta .

Ci sono molti modi per implementare questo, naturalmente, quindi basta sceglierne uno che conosci ed è veloce, e si ridimensionerà, poiché tutte le richieste verranno attraverso di esso. Vorrei suggerire un'applicazione web stateless leggera supportata da un semplice database di sola lettura che faccia l'identificatore del client appropriato -> istanza di mapping, che si dovrebbe caricare in memoria/cache. Per aggiungere flessibilità sull'hardware e sul percorso dell'istanza, utilizzare (supponendo Java) JNDI per memorizzare le informazioni sull'hardware/porta/ecc per ogni istanza e, nella propria mappatura dell'identificatore, mappare l'identificativo del client alla chiave di ricerca JNDI appropriata.

+0

risposta più pragmatica, suppongo :) – morpheous

0

Questa è davvero una domanda molto difficile; semplicemente perché ci sono molte risposte possibili e quale è il migliore può essere determinato solo da te e dal tuo ambiente.

Scriverò un modulo apache in C++ per farlo. Usando this book, sono riuscito a iniziare a scrivere moduli molto efficienti.

Per essere in grado di darvi ulteriori soluzioni (magari semplicemente impostando un proxy Squid?), Sarà necessario specificare in che modo sarà possibile determinare a quale server è necessario reindirizzare il client. Se puoi farlo tramite IP, anche se un parametro GET, anche se un parametro POST XML (come SOAP). Etc.

+0

Devo ammettere, sono stato sedotto dall'idea di scrivere un modulo apache - ma il punto che Ahmed mi ha fatto riportare alla realtà :) – morpheous

+0

@morpheous L'ho già fatto, e non era poi così male. Usando un tutorial come base per la mia app, ero attivo e funzionante in mezza giornata. Da quel momento in poi, non ho mai dovuto tornare indietro e toccare le cose specifiche di Apache. – Gianni

0

Come l'altra risposta dice che ci sono molti modi per affrontare questo problema. Supponiamo che tu NON abbia accesso al codice sorgente del software legacy, il che significa che non puoi modificarlo per ascoltare su porte diverse per istanze diverse.

Scrivere il modulo Apache sembra MOLTO estremo per risolvere questo problema (e come qualcuno che ha appena finito di scrivere un modulo di produzione apache, suggerisco di evitarlo a meno che non si stiano facendo soldi).

L'approccio può essere tanto esoterico quanto vuoi. Ad esempio se il tuo software legacy funziona su una normale architettura Intel e hai la capacità hardware ci sono soluzioni VM, dove dovresti essere in grado di creare una macchina virtuale sottile, una che esegue una singola istanza del software e un multiplexer per legarli tutti.

Se invece si esegue bene qualcosa come HPUX :-) ci sono altri approcci. Che ne dici di dare un po 'più di dettagli?

Ahmed.

1

Lasciando che l'API pubblica specifichi solo l'utente mi sembra un po 'fragile. Vorrei cambiare l'API pubblica in modo che le richieste specificassero sia l'organizzazione che l'utente, e poi abbiano qualcosa di banale sul lato server che mappa le organizzazioni in istanze (ad es. Organizzazione foo -> istanza di ascolto sulla porta 7331).

+0

Vero, ma cambiare l'API è un problema banalmente semplice da risolvere però. – morpheous

Problemi correlati