Domanda

Sto costruendo un server di Erlang. Gli utenti invia le richieste HTTP al server per aggiornare il loro status. Il processo di richiesta HTTP sul server salva il messaggio di stato utente in memoria. Ogni minuto il server invia tutti i messaggi a un server remoto e cancellare la memoria. Se un utente aggiorna il suo status più volte in un minuto, l'ultimo messaggio sostituisce il precedente. E 'importante che tra leggere tutti i messaggi e di compensazione loro nessun altro processo sarà essere in grado di scrivere un messaggio di stato.

Qual è il modo migliore per attuarla?

  1. gen_server con un dict. La chiave sarà l'ID utente. dict: negozio / 3 sarà aggiornare o creare lo stato. Il gen_server risolve il problema 'transazione'.

  2. Tavolo mnesia con ram_copies. Gestire le transazioni e non ho bisogno di attuare un gen_server. C'è troppo in alto con questa soluzione?

  3. tabella ETS che è il peso più leggero e hanno una gen_server. E 'possibile fare l'operazione in ETS? Per bloccare il tavolo tra la lettura di tutti i messaggi e la loro liquidazione?

Grazie

È stato utile?

Soluzione

Dal momento che la sincronizzazione manuale, mnesia è di troppo. È chiaramente non è necessario la roba in rete, questo è la differenza principale tra fumo passivo e mnesia.

Ets, per quanto mi undertand, è solo un processo conforme OTP intorno ad un dict / sacchetto / ..., e dal momento che si dispone di più processi di accedere ai dati, è necessario utilizzare 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/...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top