Usando gen_server per incapsulare una tabella di mnesia?
Domanda
Ho un'applicazione server creata in Erlang. In esso ho un tavolo per la mnesia
che memorizzano alcune informazioni sulle foto. Nello spirito di " tutto è a
processo " Ho deciso di racchiudere quella tabella in un modulo gen_server
, in modo che il
Il modulo gen_server
è l'unico che accede direttamente alla tabella. Interrogazione
e l'aggiunta di informazioni a quella tabella viene effettuata inviando messaggi a quel processo
(che ha un nome registrato). L'idea è che ci saranno diversi client
elabora la richiesta di informazioni da quella tabella.
Funziona bene, ma quel modulo gen_server
non ha stato. Tutto
richiede è memorizzato nella tabella mnesia. Quindi, mi chiedo se sia un gen_server
non è il modello migliore per incapsulare quella tabella?
Dovrei semplicemente non renderlo un processo, e invece incapsulare solo la tabella
attraverso le funzioni in quel modulo? In caso di un bug in quel modulo, quello
causerebbe l'arresto anomalo del processo di chiamata, che penso potrebbe essere migliore, perché
interesserebbe solo un singolo client, al contrario di adesso, quando causerebbe il
Il processo gen_server
va in crash, lasciando tutti senza accesso alla tabella (fino al
il supervisore lo riavvia).
Qualsiasi input è molto apprezzato.
Soluzione
Immagino che, secondo Rasoio di Occam c'è gen_server
esista , soprattutto perché non vi è assolutamente nessuno stato . Tale processo potrebbe essere necessario in situazioni in cui è necessario accedere alla tabella (o a qualsiasi altra risorsa) per essere strettamente sequenziale (ad esempio si potrebbe voler evitare qualsiasi transazione interrotta in costo di un collo di bottiglia).
L'incapsulamento dell'accesso alla tabella in un modulo è una buona soluzione . Crea nessuna ulteriore complessità , fornendo al contempo il corretto livello di astrazione e incapsulamento.
Altri suggerimenti
Non sono sicuro di capire perché hai deciso di incapsulare una tabella con un processo. Mnesia è progettata per mediare più accessi simultanei alle tabelle, sia localmente che distribuiti su un cluster.
La creazione di un modulo API che esegue tutte le particolari operazioni di accesso alle tabelle e gli aggiornamenti è una buona idea in quanto le funzioni API trasmettono meglio le tue intenzioni nel codice che le chiama. Sarà più leggibile che inserire le operazioni di mnesia direttamente nel codice chiamante.
Un modulo API ti dà anche la possibilità di passare da mnesia a qualche altro sistema di archiviazione in seguito, se necessario. L'uso delle transazioni mnesia all'interno del modulo API ti protegge da alcuni errori di programmazione poiché mnesia eseguirà il rollback delle operazioni che si arrestano in modo anomalo. Il modulo API sarà sempre disponibile per i chiamanti e consente a un numero qualsiasi di chiamanti di eseguire operazioni contemporaneamente, mentre un'API basata su gen_server ha un punto di errore, il processo, che può rendere l'API non disponibile.
L'unica cosa che un'API basata su gen_server ti offre su un'API puramente funzionale è serializzare l'accesso alla tabella, il che è un requisito insolito e, a meno che non sia specificamente necessario, sarà un killer delle prestazioni.
Potrebbe essere una buona idea gestire una tabella mnesia usando un singolo processo gen_server quando si desidera utilizzare un accesso sporco ed evitare le transazioni. Questo approccio potrebbe essere più veloce di txs, ma come al solito è necessario confrontarlo.