2009-09-17 20 views
8

Tengo una aplicación de servidor hecha en Erlang. En él tengo una tabla de mnesia que almacena cierta información en las fotos. En el espíritu de "todo es un proceso ", decidí envolver esa tabla en un módulo gen_server, de modo que el módulo gen_server es el único que accede directamente a la tabla. Consultar y agregar información a esa tabla se realiza mediante el envío de mensajes a ese proceso (que tiene un nombre registrado). La idea es que habrá varios procesos de clientes que consulten información de esa tabla.¿Usando gen_server para encapsular una tabla de mnesia?

Esto funciona bien, pero el módulo gen_server no tiene estado. Todo lo que requiere se almacena en la tabla de mnesia. Entonces, me pregunto si un gen_server es quizás ¿no es el mejor modelo para encapsular esa tabla?

¿Debo simplemente no hacer un proceso, y en su lugar solo encapsular la tabla a través de las funciones en ese módulo? En caso de un error en ese módulo, ese haría que el proceso de llamada fallara, lo cual creo que podría ser mejor, porque solo afectaría a un único cliente, en lugar de ahora, cuando causaría el proceso gen_server bloqueo, dejando a todos sin acceso a la mesa (hasta que el supervisor lo reinicie).

Cualquier entrada es muy apreciada.

Respuesta

9

supongo acuerdo con Occam's razor hay hay necesidad de esto gen_server de existir, sobre todo porque no hay absolutamente ningún estado almacenada en él. Tal proceso podría ser necesario en situaciones en las que necesite acceder a la tabla (o cualquier otro recurso) para ser estrictamente secuencial (por ejemplo, puede querer evitar transacciones canceladas al costo de un cuello de botella).

Encapsulando el acceso a la tabla en un módulo es una buena solución. Crea sin complejidad adicional, mientras que proporciona nivel de abstracción y encapsulación adecuado.

6

No estoy seguro de entender por qué ha decidido encapsular una tabla con un proceso. Mnesia está diseñado para mediar múltiples accesos concurrentes a tablas, tanto localmente como distribuidas a través de un clúster.

Crear un módulo de API que realice todas las operaciones y actualizaciones de acceso de tabla particulares es una buena idea ya que las funciones de API transmitirán mejor su intención en el código que las llama. Será más legible que poner las operaciones de mnesia directamente en el código de llamada.

Un módulo API también le brinda la opción de cambiar de mnesia a algún otro sistema de almacenamiento más adelante si es necesario. Usar las transacciones de mnesia dentro de su módulo API lo protege de algunos errores de programación ya que mnesia retrasará las operaciones que colapsan. El módulo API siempre estará disponible para las personas que llaman y permite que cualquier número de personas realice operaciones al mismo tiempo, mientras que una API basada en gen_server tiene un punto de falla, el proceso, que puede hacer que la API no esté disponible.

Lo único que una API basada en gen_server le ofrece sobre una API puramente funcional es serializar el acceso a la tabla, que es un requisito inusual y, a menos que lo necesite específicamente, será un factor determinante del rendimiento.

0

Puede ser una buena idea manejar una tabla de mnesia utilizando el proceso gen_server único cuando desee usar acceso sucio y evitar transacciones. Este enfoque puede ser más rápido que txs, pero como suele ser necesario para compararlo.

Cuestiones relacionadas