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.

È stato utile?

Soluzione

Immagino che, secondo Rasoio di Occam c'è non è necessario che questo 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top