Attualmente stiamo lavorando al nostro nuovo prodotto / progetto, è un'applicazione client-server diretta verso determinate imprese industriali / di servizi specifici. Stiamo costruendo un server (solo linguaggio C e Linux) che esegue un protocollo personalizzato su TCP con un front-end Java. Siamo impegnati nel lavoro di codifica per circa il 20% e ci troviamo di fronte a una situazione che deve scegliere tra Micro o Monolitico Kernel Architecture.
Sono consapevole che Micro vs. Monolitico di solito è in relazione con l'architettura del kernel, ma stiamo parlando in particolare di server.
Perché un server personalizzato e non qualcosa esistente?
- Le esigenze dell'interfaccia utente sono significative e molto dinamiche, pertanto le soluzioni basate su browser Web / Web non erano appropriate.
- L'elaborazione statistica è significativa sul lato client e quindi, ancora una volta, i browser sono stati di scarso aiuto. (Ovviamente, potremmo eseguire l'elaborazione a livello del server e trasmettere i dati elaborati al client, ma ciò implicherebbe molto carico sul server e spreco di risorse del client).
- Inoltre, con almeno tre tecnologie (JS / HTML / CSS) per gestire anche un singolo evento rende l'intera esperienza come spazzare la casa nel mezzo di una tempesta nel deserto - la spazzate n-volte, la polvere si accumula n + 1 volte.
Che dire del server micro e monolitico? Di cosa stai parlando?
Considera la seguente (ipotetica) richiesta del cliente:
request-id: 123
request-service: HistoricDataSets
request-message: Fetch all records upto the year 2010
Quando si riceve tale richiesta, in genere un server (ignoriamo le tecniche di concorrenza come thread e forchette per semplicità):
- Analizzare la stringa di richiesta
- Identifica l'azione (Recupera
HistoricDataSets LIMIT Year (2010)
nel nostro caso) - Interagisci con il livello di persistenza (Oracle, diciamo, nel nostro esempio) e recupera i dati.
Formattare i dati secondo il protocollo. Ex:
id risposta: 123
esito positivo:
testo risposta vero : DataSetRispondere al client con i dati così formattati.
Questo è ciò che chiamiamo un server monolitico (simile a un kernel monolitico in cui tutte le operazioni del sistema operativo vengono eseguite nello spazio del kernel).
Considera di nuovo la stessa richiesta, al ricevimento, questa volta il server (abbiamo assunto solo memoria condivisa come IPC, sempre per semplicità):
- Mette la richiesta nella memoria condivisa per il
Parser
processo - Il
Parser
analizza la stringa, identifica il compito e dirige ilExecutioner
processo di eseguire i compiti. - L'
Executioner
poi passa i dati alFomatter
processo che, dopo la formattazione dei dati in una stringa di protocollo, torna al server. - Il server lo invia al client (risposta).
Naturalmente, invece di Parser
, Executioner
e Formatter
avrebbe potuto essere un processo unico ma separato. Questo è ciò che chiamiamo Micro Server (simile a un micro kernel che fa appena il minimo necessario). Il server effettivamente ascolta e risponde solo mentre tutti i passaggi sono gestiti da diversi processi.
Quale scegliere? Siamo confusi! Mentre i server monolitici sono provati e testati (la maggior parte dei server Web HTTP?) E più facili da programmare e in grado di gestire la concorrenza abbastanza bene. I micro server, prima facie, sembrano rapidi e in linea con il principio UNIX di un programma per svolgere un compito, ma sono anche complicati da sviluppare, esp. tenendo presente la concorrenza.
Domande
: quali sono (forse potrebbero essere) i pro ei contro di ogni approccio?
- Quando usare quale? (Potrebbe anche essere interpretato come una domanda generale: quando usare IPC?)
- Se viene scelto Micro kernel, quali funzioni devono essere parte del core-server e cosa no?
Domande simili / correlate
- Pericoli di enorme applicazione monolitica
- Browser incorporato Vs esterno (tangenziale)
- Consigli per convertire l'app monolitica in multithread (tangenziale)
Alcune informazioni che potrebbero essere utili:
- I nostri potenziali clienti possono essere suddivisi in due categorie:
- Grande: circa 1.700 - 2.000 richieste al minuto
- Piccolo: circa 650 - 700 richieste al minuto
- Si può presumere che il volume di dati per ciclo di richiesta (richiesta e la risposta successiva) sia normalmente distribuito con una media di ~ 1,20 MB e nel caso peggiore circa 250-300 MB.
- Il concetto di prodotto è relativamente nuovo ma ha la capacità di influire sulle operazioni principali, quindi prevediamo che i budget dei clienti siano flessibili solo dopo un certo ritardo (9-12 mesi) dopo l'implementazione, questo limita la quantità di hardware che il cliente sarà disposto impegnare esp. quelli piccoli.
- Ogni cliente avrà il proprio stack client-server. Il server verrà eseguito sull'hardware del cliente gestito dal team del cliente, mentre i client verranno distribuiti sulle macchine degli impiegati funzionali
- Gli aggiornamenti remoti sia per l'applicazione client che per quella server sono indispensabili
- I
PUSH
servizi in tempo reale da parte del server possono essere "altamente" desiderati se il prodotto fa clic!