Pregunta

Estoy implementando un servidor de documentos.Actualmente, si dos usuarios abren el mismo documento, luego lo modifican y guardan los cambios, el estado del documento no estará definido (o los cambios del primer usuario se guardan permanentemente o los del segundo).Esto es totalmente insatisfactorio.Consideré dos posibilidades para resolver este problema:

La primera es bloquear el documento cuando alguien lo abre por primera vez y desbloquearlo cuando se cierra.Pero si la conexión de red con el servidor se interrumpe repentinamente, el documento permanecerá bloqueado para siempre.La solución obvia es enviar pings regulares al servidor.Si el servidor no recibe K pings seguidos (K > 1) de un cliente en particular, los documentos bloqueados por este cliente se desbloquean.Si ese cliente vuelve a aparecer, los documentos se bloquean nuevamente, si alguien aún no los había bloqueado.Esto también podría ayudar si la aplicación cliente (que se ejecuta en el navegador web) finaliza inesperadamente, lo que hace imposible enviar una señal de "salir, desbloquear mis documentos" al servidor.

La segunda es almacenar múltiples versiones del mismo documento guardadas por diferentes usuarios.Si los cambios en el documento se realizan en rápida sucesión, el sistema ofrecerá fusionar versiones o seleccionar una versión preferida.Para optimizar el espacio de almacenamiento, solo se deben conservar las diferencias de documentos (al igual que el software de control de código fuente).

¿Qué método debo elegir, teniendo en cuenta que la conexión al servidor podría a veces ¿Ser lento y no responder?¿Cómo se deben determinar los parámetros (intervalo de ping, intervalo de sucesión rápida)?

PDLamentablemente, no puedo almacenar los documentos en una base de datos.

¿Fue útil?

Solución

Mi sugerencia sería algo parecido a la primera.Cuando el primer usuario (Bob) abre el documento, adquiere un bloqueo para que otros usuarios solo puedan leer el documento actual.Si el usuario guarda el documento mientras lo está utilizando, mantiene el bloqueo.Sólo cuando sale del documento, éste se desbloquea y otras personas pueden editarlo.

Si el segundo usuario (Kate) abre el documento mientras Bob tiene el bloqueo, Kate recibirá un mensaje que indica que el documento no se puede editar, pero podrá leerlo hasta que se libere el bloqueo.

Entonces, ¿qué sucede cuando Bob adquiere el candado, tal vez guarda el documento una o dos veces pero luego sale de la aplicación dejando el candado colgado?

Como usted mismo dijo, exigir que el cliente con el bloqueo envíe pings a una frecuencia determinada es probablemente la mejor opción.Si no recibe un ping del cliente durante un período de tiempo determinado, esto significa efectivamente que su cliente ya no responde.Si se trata de una aplicación web, puede utilizar javascript para los pings.El documento que se guardó por última vez libera su bloqueo y Kate ahora puede adquirirlo.

Un ping puede contener el nombre del documento que el cliente tiene bloqueado y el servidor puede calcular cuándo se recibió el último ping para ese documento.

Otros consejos

La primera opción que usted describe es esencialmente un modelo de bloqueo pesimista, mientras que la segunda es un modelo optimista.Cuál elegir realmente se reduce a una serie de factores, pero esencialmente se reduce a cómo quiere funcionar la empresa.Por ejemplo, ¿sería un inconveniente indebido para los usuarios si otro usuario bloqueara un documento que necesitaban editar?¿Qué pasa si se bloquea un documento y alguien se va de vacaciones con su cliente conectado?¿Cuál es la disputa probable para cada documento?¿Qué posibilidades hay de que dos usuarios modifiquen el mismo documento al mismo tiempo? ¿Qué tan localizadas es probable que estén las modificaciones dentro de un solo documento?(Si la misma sección se modifica periódicamente, realizar una combinación puede llevar más tiempo que simplemente volver a realizar los cambios).

Suponiendo que la contención sea relativamente baja y/o que el tamaño de cada cambio sea bastante pequeño, entonces probablemente optaría por un modelo optimista que resuelva los conflictos mediante una combinación automática o manual.Se puede utilizar un número de versión o una suma de verificación del contenido del documento para determinar si se requiere una combinación.

Actualmente los documentos son publicados por un grupo limitado de personas, cada una de las cuales trabaja en un tema distinto.Así, se minimizan las molestias que introducen las cerraduras.La mayoría de las personas amplían los documentos existentes y corrigen errores en ellos.

Hablando del modelo pesimista, el escenario de "cliente dejado conectado durante N días" podría evitarse estableciendo la fecha de vencimiento del bloqueo en, digamos, un día antes de la fecha de inicio del bloqueo.Debido a que los documentos editados no son de ninguna manera críticos y rara vez son modificados por varios usuarios, eso podría ser suficiente.

Consideremos ahora el modelo optimista.¿Cómo deberían detectarse las diferencias si los documentos tienen alguna estructura regular (digamos, jerárquica)?¿Si no?¿Cuáles son las posibilidades de una fusión automática exitosa en estos casos?

La situación se vuelve más complicada, porque algunos de los documentos (editados por el grupo de usuarios 'administradores') contienen información de configuración importante (índice global de documentos, roles de usuario, etc.).En mi opinión, las cerraduras son más ventajosas precisamente para este tipo de información, porque no se modifican todos los días.Por tanto, alguna solución híbrida podría ser aceptable.

¿Qué opinas?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top