Quiero que varios usuarios editen el mismo documento. El problema que estoy enfrentando es cuando un nuevo usuario se une, puede ver un documento desactualizado. ¿Cómo me aseguro de que los nuevos usuarios obtengan los cambios más recientes?
Algunas soluciones en las que pensé:
Ahorre en cada cambio. No me gusta esta solución porque ralentizará las cosas en la interfaz de usuario y pondrá carga en db.
Cuando se une un nuevo usuario, active guardar en todos los demás clientes. Después de que otros clientes hayan guardado, cargue el documento. Con esto todavía puede haber inconsistencia.
Cualquier otra sugerencia sería útil.
ACTUALIZACIÓN: Después de buscar la solución sugerida, la API de Google Realtime, descubrí que:
Los usuarios de su aplicación deben tener Google Drive y darle acceso a su disco . En el mejor de los casos, esto podría presentar un flujo de interfaz de usuario incómodo o evitar que los usuarios que no tienen Google Drive usen la función en tiempo real.
Todas las configuraciones de uso compartido que se realizan de su lado deben replicarse para el documento de Google.
ACTUALIZACIÓN 2: Para lograr el objetivo, fui con Firebase de Google
fuente
Respuestas:
Google Drive
Si está intentando crear su propia versión de Google Docs, le sugiero que eche un vistazo a la API de Google Realtime . Google lanzó recientemente esto con la intención de permitir que otros desarrolladores utilicen las mismas herramientas que hicieron para permitir la colaboración en tiempo real. Esto le permitiría ahorrar tiempo en su desarrollo y obtener un producto que funcione antes.
Puede tomar fácilmente los datos que están en el documento e insertarlos en su base de datos a intervalos regulares, o hacer que la base de datos sea un "participante" del intercambio, simplemente escuchando y registrando todos los cambios. También permite que un usuario defina sus propias estructuras de datos que luego se pueden usar en la API en tiempo real, por lo que puede extenderlas como mejor le parezca.
No es Google Drive
Entonces, según su investigación, Google Drive no es una opción. Eso está bien, pero será más difícil y posiblemente no funcione tan bien, dependiendo de cuánto le pongas.
Aquí hay una estrategia general que usaría para llevar a cabo este problema:
Que el servidor sea el multiplexor de comunicación. Cada persona habla con el servidor, y el servidor envía esa información a todos los demás. De esta manera, el servidor siempre tiene la vista más actualizada del documento.
Encuentre un algoritmo / módulo de terceros para la resolución de conflictos. La resolución de conflictos es difícil, y es algo que aún no es perfecto. Hacer esto solo podría aumentar fácilmente el alcance del proyecto para que sea demasiado grande. Si no puede utilizar un algoritmo de terceros, le sugiero que solo permita que un usuario edite un área de una vez, de modo que el usuario debe obtener un bloqueo antes de editar un área, o corre el riesgo de destruir el trabajo de otros usuarios, lo que se pondrá muy viejo, muy rápido.
Cuando se une un nuevo usuario, entréguele el documento más reciente y comience a transmitir los comandos automáticamente. El servidor tiene la vista más reciente y, por lo tanto, puede distribuirlo automáticamente.
Copia de seguridad en la base de datos a ciertos intervalos. Decida con qué frecuencia desea realizar una copia de seguridad (cada 5 minutos o tal vez cada 50 cambios). Esto le permite mantener la copia de seguridad que desea.
Problemas: esta no es una solución perfecta, así que aquí hay algunos problemas que puede enfrentar.
El rendimiento del servidor podría obstaculizar el rendimiento
Demasiadas personas que leen o escriben podrían sobrecargar el servidor
Las personas pueden perder la sincronización si se pierde un mensaje, por lo que es posible que desee asegurarse de sincronizar en puntos regulares. Esto significa enviar el mensaje completo nuevamente, lo que puede ser costoso, pero de lo contrario las personas podrían no tener el mismo documento y no saberlo.
fuente
Recomiendo 1 copia persistente del documento en el servidor. Cuando un cliente se conecta al servidor, emite un
UPDATE
comando (s) a ese cliente con todos los cambios.Actualizar WorkFlow
El usuario provoca cambios desencadenantes -> El cliente envía
UPDATE
al servidor -> El servidor envíaUPDATE
a los clientesDisparadores viables
Implementación de actualización
Sugeriría poder volver a crear el documento con una serie de
UPDATE
comandos para que el servidor almacene cada ACTUALIZACIÓN y cuando un nuevo cliente se conecte, el cliente puede enviar la serie de actualizaciones y él mismo puede volver a crear el documento para mostrarlo el usuario. Además, también puede tener unSAVE
comando que esté separado y que ACTUALIZAR sean cambios temporales que se pueden usar paraUNDO
solicitudes y que GUARDAR realmente lo almacene para volver a abrirlo si el servidor está cerrado o todos los clientes se desconectan.fuente
1) Echa un vistazo a Knockout.js
Sigue un patrón MVVM y enviará automáticamente notificaciones a la Vista en función de los cambios en el Modelo. Por ejemplo, mire su matriz observable para proporcionar un poco más de información sobre cómo lo hacen.
2) Mezcle eso con SignalR y ahora debería tener la capacidad de enviar notificaciones a otros usuarios que trabajan en el documento. Desde su sitio:
Por lo tanto, deberá tener algunos ganchos en su nivel de modelo dentro de Knockout.js para hacer algunas llamadas SignalR cada vez que ocurra un cambio. Los otros clientes recibirán el aviso de SignalR y luego activarán un cambio correspondiente en su copia del Modelo, que volverá a subir a su Vista.
Es una combinación interesante de los dos marcos, y debería poder buscar y recopilar más información para manejar los detalles.
Por ejemplo, este ejemplo de proyecto de código aborda específicamente lo
Co Working UIs and Continuous Clients
que parece ser exactamente lo que está tratando de hacer.Esta publicación de blog parece ser un punto de entrada a una serie de publicaciones de blog que discuten el uso de los dos paquetes y contrastan con un enfoque tradicional de ASP.NET. Puede proporcionar algunos puntos para su consideración mientras diseña su sitio.
Esta publicación de blog parece ser un poco más básica y proporciona las bases para combinar los dos paquetes.
Divulgación: no estoy afiliado a ninguno de los enlaces anteriores, ni he profundizado en su contenido para ver qué tan correcto o correcto es.
fuente
La solución es la transformación operativa (OT). Si no has oído hablar de él, OT es una clase de algoritmos que hacen concurrencia en tiempo real de múltiples sitios. OT es como git en tiempo real. Funciona con cualquier cantidad de retraso (de cero a un feriado extendido). Permite a los usuarios realizar ediciones simultáneas en vivo con poco ancho de banda. OT le brinda una consistencia eventual entre múltiples usuarios sin reintentos, sin errores y sin sobrescribir ningún dato.
Pero implementar OT es una tarea difícil y que requiere mucho tiempo. Por lo tanto, es posible que desee utilizar una biblioteca externa como http://sharejs.org/ .
fuente
Depende principalmente del tipo de sus documentos y de cómo colaboran sus usuarios.
Sin embargo, yo haría:
Ventajas:
Desventajas
fuente
Esencialmente, lo que está preguntando es cómo lidiar con el estado mutable compartido. Ahorrar es la parte fácil; pero, ¿cómo lidias con varias personas que editan la misma cosa al mismo tiempo? Desea que todos los usuarios vean el mismo documento mientras sincronizan ediciones simultáneas, todo en tiempo real.
Como probablemente haya reunido, ¡es un problema difícil! Hay algunas soluciones pragmáticas:
fuente