2012-08-03 14 views
7

Mi piacerebbe creare un'applicazione web in tempo reale soft fault-tolerant per un negozio di consegna pizza. Dovrebbe aiutare la pizzeria ad accettare le telefonate dei clienti, inserirli nel sistema (tramite un client Web CRM) e aiutare gli spedizionieri ad assegnare i corrieri agli ordini.Creazione di un'applicazione Web in tempo reale soft fault-tolerant con Erlang/OTP

Questi obiettivi non sono nulla di insolito, ma mi piacerebbe rendere il servizio disponibile 24 ore su 24, 7 giorni su 7, ovvero renderlo tollerante ai guasti. Inoltre, mi piacerebbe farlo funzionare molto velocemente e di essere molto reattivo.

Di seguito è una vista di architettura molto semplice per tale applicazione.

pizza delivery shop orders system

Il problema è che non so come usare tutta la bontà Erlang/OTP per rendere l'applicazione molto reattivo e fault tolerant.

Ecco le mie domande:

  1. Quali elementi del sistema dovrebbe essere replicato al fine di fornire la tolleranza d'errore e come devo fare? So che posso memorizzare lo stato di ciascun veicolo (coordinate, ordini assegnati, ecc.) In un database Mnesia replicato. È una strada giusta da percorrere?
  2. Quali servizi di archiviazione dati dovrebbero essere basati su SQL convenzionale (ad esempio in base a boss_db) e che dovrebbero essere eseguiti su Mnesia per fornire una risposta molto rapida? Va bene usare un database SQL convenzionale per archiviare i record e la cronologia dei clienti in un'applicazione così resistente ai guasti e altamente reattiva?
  3. Devo provare a memorizzare tutti i dati per tutti i servizi (clienti, stato dei veicoli, ecc.) Nella RAM al fine di rendere l'applicazione altamente reattiva?
  4. Devo memorizzare i dati del veicolo persistente (id, capacità, ecc.) In un database SQL convenzionale e memorizzare i dati in tempo reale (coordinate, ordini assegnati, ordini nel bagagliaio, ecc.) In un database Mnesia per l'applicazione più reattiva in tempo reale?
+1

Se non si replicano tutti i dati e la logica dell'applicazione, come si effettuerà il servizio 24 ore su 24, 7 giorni su 7 in caso di es. un errore del server di database;) –

+0

È possibile fornire un riferimento su come replicare i dati in un sistema Erlang/OTP che ha 2 o più nodi che si occupano di logica? Gruppo di processi – skanatek

+0

, inviare a tutti, risoluzione dei conflitti o semplicemente utilizzare riak/couchdb. O guardi mnesia. Ma farlo da solo sarà un compito davvero difficile. –

risposta

8

Prima di tutto, questa è una grande domanda, ma proverò a scomporla. Diamo prima un'occhiata ai fatti. È un servizio web. Il che significa che abbiamo questi livelli: Web Server, Middle ware application e quindi Data Storage. Nella maggior parte delle applicazioni altamente disponibili, il livello di archiviazione dati deve disporre della ridondanza tramite replication e caricare gestito tramite Distribution. Nella maggior parte delle applicazioni del mondo reale, non è necessario memorizzare nulla nella RAM, a meno che l'applicazione non sia realmente in tempo reale, come ad esempio Multi-player Game Server o A telecom Switch. Quindi, il tuo tipo di applicazione, in questo caso davvero, non necessita di memoria RAM (forse una sorta di caching qui e là, come vedremo.)

Ora, questo tipo di applicazione, coinvolge diversi tipi di dati, informazioni che non possono avere lo stesso modulo in qualsiasi momento, quindi, l'utilizzo di un RDMS ti costringerà a organizzare tutto allo stesso modo. Il mio suggerimento è che impari a usare qualsiasi document oriented database, un NoSQL DB o key-value system perché sono ben modellati per le complessità del mondo reale. Ulteriori informazioni su qualsiasi tipo di archiviazione sono disponibili in questo pdf. Ti suggerisco di utilizzare Couch base server in base al quale i tuoi dati saranno semplicemente JSON documents, schemaless e possono essere modificati man mano che l'applicazione cresce. Viene fornito con la distribuzione e la replica, proprio come qualsiasi applicazione ha mai avuto bisogno. È possibile aggiungere server o rimuovere server in fase di esecuzione e l'intero sistema continua a riequilibrare se stesso. Inoltre viene fornito con memcached integrato per il caching, quindi per la parte IN-Memory di cui stavi parlando, il caching farà tutto per te.

Dopo l'archiviazione, parliamo del middle ware. Voglio parlare del web server come parte del middleware. Avrai bisogno di un server Web molto stabile, a seconda del carico, ed essendo che vuoi usare Erlang, ti suggerisco di yaws web server e impara a fare RESTFUL services con esso usando appmods. L'utilizzo di Proxies sunch come Nginx di fronte a un cluster di server Web può aiutare nella gestione del carico. Almeno ci sono diversi modi di bilanciamento del carico di fronte ai server web. Dopo questo, avrai bisogno di un'applicazione OTP. Un'applicazione OTP non deve necessariamente avere gen_servers. Ma come imparerai, scoprirai, in realtà, dove hai bisogno di parallelizzazione o dove hai bisogno del codice sequenziale. Tuttavia, è preoccupante che tu voglia usare qualcosa che non hai ancora imparato. Si prega di seguire this web book e questo Orielly book per aiutarvi a padroneggiare tutto su Erlang. Potresti trovare utile provare le librerie del server Http Chicago Boss e Mochiweb o Misultin.

L'altra cosa che dovrei menzionare riguardo a questo in Erlang è che devi padroneggiare le tue strutture dati e un modo efficace per lavorare con loro. La scarsa scelta delle strutture dati può causare problemi. Prova e prova tutto ad ogni passo. Utilizzare records ovunque se possibile e controllare il consumo di memoria in ogni fase. C'è solo molto da dire su questa domanda, ma si spera che anche altri stiano pubblicando il loro pensiero.

+0

Il libro oreilly è collegato a learnyousomeerlang. Avrei modificato, ma non so quale libro intendi, ci sono almeno 2 libri di approfondimento;) –

+0

ho risolto il link. Mi dispiace per il fatto che –

+0

@MuzaayaJoshua Qual è l'approccio/strumento migliore per fare in modo che Data Storage memorizzi tutto nella RAM in caso di server di gioco multi-player? – skanatek

2

hack questo gioco: https://github.com/synrc/games tutto in tempo reale, a bassa latenza, pub/sub, base di dati, le domande di architettura sono lì, scritto come un software state-of-the-art. Suggerisco di usare gen_fsm per controllare gli stati nella tua app come fatto dai supervisori "okay". riak è integrato con kvs lib, che ha anche un buon supporto per gli aggiornamenti social. n2o ha scelto il server cowboy, a mio avviso, il miglior server in circolazione. http://www.ostinelli.net/a-comparison-between-misultin-mochiweb-cowboy-nodejs-and-tornadoweb/