2010-01-28 21 views
13

Estoy construyendo un servidor erlang. Los usuarios envían solicitudes HTTP al servidor para actualizar su estado. El proceso de solicitud http en el servidor guarda el mensaje de estado del usuario en la memoria. Cada minuto, el servidor envía todos los mensajes a un servidor remoto y borra la memoria. Si un usuario actualiza su estado varias veces en un minuto, el último mensaje anula el anterior. Es importante que, entre leer todos los mensajes y borrarlos, ningún otro proceso pueda escribir un mensaje de estado.gen_server con una tabla dict vs mnesia vs ets

¿Cuál es la mejor manera de implementarlo?

  1. gen_server with a dict. La clave será el ID de usuario. dict: store/3 actualizará o creará el estado. Gen_server resuelve el problema de 'transacción'.

  2. mnesia table with ram_copies. Manejar transacciones y no necesito implementar gen_server. ¿Hay demasiada sobrecarga con esta solución?

  3. tabla ETS que es más liviana y tiene gen_server. ¿Es posible hacer la transacción en ETS? Para bloquear la mesa entre leer todos los mensajes y borrarlos?

Gracias

+1

Esto ha sido discutido en las preguntas de Erlang-lista de correo. – rvirding

+5

Y aquí hay un enlace a la discusión, para aquellos como yo que encontraron stackoverflow primero: http://erlang.2086793.n4.nabble.com/gen-server-with-a-dict-vs-mnesia-table-vs- ets-td2119064.html – JoelPM

Respuesta

18

Puesto que usted la sincronización de forma manual, mnesia es mucho. Claramente, no necesitas el material de networking, esa es la principal diferencia entre ets y mnesia.

Por lo que yo entiendo, es solo un proceso que cumple con otp en torno a un dict/bag/..., y dado que tiene múltiples procesos accediendo a sus datos, debe usar ets.

me ocurrió con la siguiente lógica para mí mismo:

Multiple processes on multiple VMs -> mnesia 
Multiple processes on one VM -> ets/dets 
One process -> bag/dict/...