¿Cómo manejas a múltiples usuarios editando la misma pieza de datos en una aplicación web?

26

Hay un proyecto en el que estoy trabajando que busca producir una aplicación web que gestione una lista de tareas entre múltiples usuarios. Esta es una lista de tareas maestra cuyos elementos de tareas son distribuidos por un usuario autorizado. Cada usuario tiene su propia cuenta para iniciar sesión y ver las tareas que tiene asignadas; Es posible que varios usuarios tengan una sola tarea en común.

Estoy tratando de dejar los detalles del proyecto fuera de esto ya que estoy lidiando más con el concepto general de cómo manejar las siguientes situaciones, pero si ayuda, estoy usando Java, EclipseLink y GWT con RequestFactory implementado. La base de datos es PostgreSQL.

Entonces, los problemas conceptuales que intento conciliar son los siguientes:

  1. Si una sola tarea que es común a múltiples usuarios cambia de alguna manera, por ejemplo, tarea completada, eliminada, etc., la lista de tareas de todos los usuarios que tienen esta tarea se actualizará. ¿Qué patrones de diseño hay que ayuden a implementar esta función?

    • Algunos patrones que he visto son Observador y Mediador. ¿Hay otros que deberían considerarse sobre estos?
  2. Digamos que hay dos usuarios que cambian la misma tarea al mismo tiempo.

    • Primero, ¿debería permitir que ocurra esa situación o debería bloquearla hasta que una u otra persona haya terminado de hacer cambios?

    • En segundo lugar, si no lo bloqueo, ¿cómo concilio los cambios que debo aceptar? Esto implica la situación en 1 porque el usuario 1 podría enviar los datos y antes de que el usuario 2 reciba los datos actualizados, él / ella puede haber seguido adelante y enviado los cambios.

Realmente estoy buscando cualquier punto guía, consejo o sugerencia que pueda proporcionar sobre cómo sincronizar correctamente los datos entre varias instancias de esta aplicación web. ¡Se lo agradecería mucho!

Hulkmeister
fuente

Respuestas:

17

Creo que Whiteboard será su patrón de elección para el n. ° 1, debe publicar los cambios en las tareas (u otros datos compartidos) en un lugar común, para que todas las partes interesadas puedan verlos y DTRT.

Para el n. ° 2, debe mirar el bloqueo optimista . Básicamente, debe marcar todos sus registros editables con la última hora de actualización. Cuando intenta guardar el registro, primero verifica que el registro en la base de datos tenga la misma marca de tiempo actualizada por última vez que su registro. De lo contrario, alguien ha actualizado el registro y ahora tiene que obtener el registro actualizado e informar al usuario que necesita ingresar sus cambios nuevamente, o puede intentar fusionar los cambios del usuario en el registro actualizado (que generalmente resulta ser simple o imposible).

TMN
fuente
7

Se me ocurrió un diseño para una aplicación de escritorio (que aún no se ha probado por completo) con requisitos similares que podrían ser útiles.

Mi solución fue emplear el patrón MVC (con un solo Modelo pero múltiples Controladores y Vistas) donde cada Controlador realizó cambios en el Modelo usando transacciones (usando STM ) y cuando se confirmó una transacción, el Modelo transmitió una notificación de actualización a las Vistas )

Cada cliente también realizó un seguimiento de cualquier cosa que se actualizara localmente, pero cuando se terminaron esas actualizaciones locales (es decir, enviadas para su confirmación) volvió a usar la información subyacente del Modelo.

También tuve una pila de deshacer con todos los cambios que hicieron los usuarios para que las cosas pudieran revertirse.

Sin embargo, este podría no ser el mejor modelo para una aplicación web, ya que el Modelo tuvo que transmitir cambios a las Vistas, lo que podría no ser el más fácil con un cliente web.

Paul
fuente
4

para 1. debería ver si el patrón de publicación / suscripción es más adecuado.
para 2. depende de su situación:

  • ¿Cuán frecuente será esta situación?
  • ¿Qué tan grave es una situación en la que uno de sus usuarios no podrá actualizar una tarea porque está bloqueada o alguien más la ha cambiado mientras tanto?
    Personalmente, prefiero un enfoque (utilizado, por ejemplo, en pivotaltracker ) en el que hay:
    • sin cerraduras,
    • ve todos los cambios en tiempo real y
    • la interfaz de usuario invita a realizar actualizaciones menores frecuentes en lugar de actualizaciones más grandes en múltiples atributos.
    • mantiene un historial de todos los cambios que se han realizado. Si el historial es visible para los usuarios, los conflictos o sobrescrituras que puedan surgir pueden resolverse con comentarios, anotaciones o mensajes.
kr1
fuente
La pregunta es más académica, por lo que diré con mucha frecuencia para ver cómo se maneja en el peor de los casos. +1 para las referencias de patrón.
hulkmeister
@ kr1 pivotaltracker carece de advertencia de conflicto y no combina cambios no conflictivos, por lo que no debe usarse como un buen ejemplo de una buena aplicación multiusuario de edición de registros.
Eduardo
0

Mi recomendación es nunca bloquear e informar un conflicto si sucede.

Por favor, eche un vistazo a:

https://github.com/spring-projects/spring-petclinic/issues/433

Puedes ver un video y un código de muestra.

¿Cumplirá eso tus requisitos?

Eduardo
fuente