Pergunta

Eu tenho um aplicativo de servidor feita em Erlang. Nele eu tenho uma tabela mnesia que armazenar algumas informações no fotos. No espírito de "tudo é uma processar" Eu decidi quebrar essa tabela em um módulo gen_server, para que o gen_server módulo é o único que aceda directamente a tabela. Consultando e adicionando informações para que a tabela é feita através do envio de mensagens para esse processo (Que tem um nome registado). A ideia é que haverá vários cliente processos de consulta de informações dessa tabela.

Isso funciona muito bem, mas esse módulo gen_server tem nenhum estado. -lhe tudo requer é armazenado na tabela de mnesia. Então, eu me pergunto se um gen_server é talvez não é o melhor modelo para encapsular essa mesa?

Eu deveria simplesmente não torná-lo um processo e, em vez única encapsular a mesa através das funções nesse módulo? No caso de um bug no módulo, que faria com que o processo de chamada de acidente, que eu acho que poderia ser melhor, porque ele só iria afectar um único cliente, ao contrário de agora, quando ele iria fazer com que o processo gen_server ao acidente, deixando todos sem acesso à tabela (até os supervisor reinicia).

Qualquer entrada é muito apreciada.

Foi útil?

Solução

Eu acho que de acordo com a Navalha de Occam é nenhuma necessidade para este gen_server de existir , especialmente porque não há absolutamente nenhum estado armazenados nele. Tal processo pode ser necessária em situações em que você precisa de acesso para a mesa (ou qualquer outro recurso) para ser estritamente sequencial (por exemplo, você pode quer evitar quaisquer transações abortadas na custo de um gargalo).

O encapsulamento acesso à tabela em um módulo é uma boa solução . Ele cria nenhuma complexidade adicional , ao fornecer correta nível de abstração e encapsulamento.

Outras dicas

Eu não tenho certeza eu entendo por que você decidiu encapsular uma tabela com um processo. Mnesia é projetado para mediar vários acessos simultâneos a tabelas, ambos localmente e distribuída através de um cluster.

Criação de um módulo API que realiza todas as operações e atualizações específicas de acesso tabela é uma boa idéia de como as funções da API irá transmitir a sua intenção melhores no código que chama-los. Vai ser mais legível do que colocar as operações mnesia diretamente no código de chamada.

Um módulo API também lhe dá a opção de mudar de mnesia para algum outro sistema de armazenamento mais tarde, se você precisar. Usando transações mnesia dentro do seu módulo API protege você de alguns erros de programação como mnesia vai roll-back operações que acidente. O módulo API estará sempre disponível para os chamadores e permite que qualquer número de chamadas para executar operações em simultâneo, enquanto uma API baseada gen_server tem um ponto de falha, o processo, que pode tornar a API indisponíveis.

A única coisa que uma API baseada gen_server dá-lhe mais de uma API puro-funcional é o acesso serialize para a mesa -. Que é uma exigência incomum e, a menos que você precisar especificamente, ele vai ser um assassino de desempenho

Pode ser uma boa idéia para lidar com uma tabela mnesia usando o processo gen_server único quando você quiser usar o acesso e evitar transações sujas. Esta abordagem pode ser mais rápido do que txs, mas como normalmente você precisa de benchmark-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top