2009-09-17 10 views
8

Ho un'applicazione server realizzata in Erlang. In esso ho una tabella mnesia che memorizza alcune informazioni sulle foto. Nello spirito di "tutto è un processo " ho deciso di avvolgere quella tabella in un modulo gen_server, in modo che il modulo gen_server sia l'unico che accede direttamente alla tabella. La query e l'aggiunta di informazioni a tale tabella vengono effettuate inviando messaggi a tale processo (che ha un nome registrato). L'idea è che ci saranno diversi processi client che richiedono informazioni da quella tabella.Utilizzare gen_server per incapsulare una tabella mnesia?

Questo funziona bene, ma quello modulo gen_server non ha stato. Tutto ciò che richiede è memorizzato nella tabella mnesia. Quindi, mi chiedo se uno gen_server è forse il non il miglior modello 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 errore in quel modulo, quello causerebbe l'arresto anomalo del processo chiamante, che penso potrebbe essere migliore, perché riguarderebbe solo un singolo client, al contrario di adesso, quando causerebbe il processo gen_server crash, lasciando tutti senza accesso al tavolo (fino al il supervisore lo riavvia).

Qualsiasi input è molto apprezzato.

risposta

9

immagino in base alle Occam's razor non v'è alcuna necessità di questo gen_server di esistere, soprattutto perché non c'è assolutamente nessuno stato in essa memorizzati. Tale processo potrebbe essere necessario in situazioni in cui è necessario l'accesso alla tabella (o qualsiasi altra risorsa) per essere rigorosamente sequenziale (ad esempio, potrebbe desidera evitare qualsiasi transazione interrotta al costo di un collo di bottiglia).

L'incapsulamento dell'accesso al tavolo in un modulo è una buona soluzione. Crea senza ulteriore complessità, pur fornendo il corretto livello di astrazione e incapsulamento.

6

Non sono sicuro di aver capito perché hai deciso di incapsulare una tabella con un processo. Mnesia è progettato per mediare più accessi simultanei alle tabelle, sia localmente che distribuiti in un cluster.

La creazione di un modulo API che esegua tutte le operazioni di accesso alla tabella e gli aggiornamenti specifici è una buona idea in quanto le funzioni API trasmetteranno meglio l'intento nel codice che le chiama. Sarà più leggibile che mettere le operazioni di mnesia direttamente nel codice chiamante.

Un modulo API offre anche la possibilità di passare da mnesia ad altri sistemi di archiviazione in seguito, se necessario. L'uso di transazioni mnesia all'interno del modulo API ti protegge da alcuni errori di programmazione dato che mnesia eseguirà operazioni di rollback che si bloccano. Il modulo API sarà sempre disponibile per i chiamanti e consente a qualsiasi numero di chiamanti di eseguire operazioni contemporaneamente, mentre un'API gen_server ha un punto di errore, il processo, che può rendere l'API non disponibile.

L'unica cosa che un'API gen_server fornisce su un'API puramente funzionale è serializzare l'accesso alla tabella, che è un requisito insolito e, a meno che non sia specificamente necessario, sarà un killer delle prestazioni.

0

Potrebbe essere una buona idea gestire una tabella mnesia utilizzando il processo gen_server singolo quando si desidera utilizzare l'accesso dirty ed evitare le transazioni. Questo approccio potrebbe essere più veloce di Tx, ma come di solito è necessario confrontarlo.

Problemi correlati