2010-01-28 21 views
13

Sto costruendo un server erlang. Gli utenti inviano richieste HTTP al server per aggiornare il loro stato. Il processo di richiesta http sul server salva il messaggio di stato dell'utente in memoria. Ogni minuto il server invia tutti i messaggi a un server remoto e cancella la memoria. Se un utente aggiorna il suo stato più volte in un minuto, l'ultimo messaggio sovrascrive quello precedente. È importante che tra la lettura di tutti i messaggi e la loro eliminazione nessun altro processo possa scrivere un messaggio di stato.gen_server con una tabella dict vs mnesia vs ets

Qual è il modo migliore per implementarlo?

  1. gen_server con un dett. La chiave sarà l'ID utente. dict: store/3 aggiornerà o creerà lo stato. Gen_server risolve il problema della "transazione".

  2. tabella mnesia con ram_copies. Gestire le transazioni e non ho bisogno di implementare un gen_server. C'è troppo sovraccarico con questa soluzione?

  3. Tabella ETS che è più leggera e ha un gen_server. È possibile fare la transazione in ETS? Bloccare la tabella tra leggere tutti i messaggi e cancellarli?

Grazie

+1

Questo è stato discusso sulle Erlang-domande mailing-list. – rvirding

+5

Ed ecco un link alla discussione, per quelli come me che hanno trovato prima stackoverflow: http://erlang.2086793.n4.nabble.com/gen-server-with-a-dict-vs-mnesia-table-vs- ETS-td2119064.html – JoelPM

risposta

18

Dal momento che la sincronizzazione manuale, mnesia è di troppo. Chiaramente non hai bisogno del networking, questa è la principale differenza tra ets e mnesia.

Ets, per quanto ho capito, è solo un processo otp ottemperante attorno a un dtt/bag/..., e dal momento che hai più processi che accedono ai tuoi dati, dovresti usare ets.

Sono venuto con la seguente logica per me stesso:

Multiple processes on multiple VMs -> mnesia 
Multiple processes on one VM -> ets/dets 
One process -> bag/dict/...