2011-02-23 12 views
56

Estoy escribiendo una aplicación en la que me gustaría tener características de edición colaborativa casi en tiempo real para documentos (muy similar a la edición de estilo de documentos de Google).Edición colaborativa en tiempo real: ¿cómo funciona?

Soy consciente de cómo hacer un seguimiento de la posición del cursor, eso es simple. Simplemente sondee el servidor cada medio segundo o segundo con la identificación de usuario actual, el nombre de archivo, el número de línea y el número de fila que pueden almacenarse en una base de datos, y el valor de retorno de esta solicitud de sondeo es la posición de los cursores de otros usuarios.

Lo que no sé hacer es actualizar el documento de tal forma que no arroje el cursor y fuerce una recarga completa, ya que eso sería muy lento para mis propósitos.

Esto realmente solo tiene que funcionar en Google Chrome, preferiblemente Firefox también. No necesito apoyar a ningún otro navegador.

Respuesta

42

El algoritmo utilizado detrás de las escenas para fusionar ediciones colaborativas de múltiples pares se llama operational transformation. Sin embargo, no es trivial implementarlo.

Consulte también this question para obtener enlaces útiles.

+0

Así que si tuviera que usar http://code.google.com/p/google-diff-match-patch/, y decir generar un diff cada 0.5 segundos, enviarlo al servidor y extraer todas las demás diferencias y devolverlos desde el servidor, ¿crees que eso funcionaría? ¿No sería esto una gran cantidad de datos almacenados en la base de datos? –

+0

Probablemente sea mucho más costoso en términos de recursos en comparación con la Transformación operativa real. Supongo que podría funcionar si tienes pocos usuarios. –

+3

Si está buscando una implementación de transformación operativa, le sugiero buscar en Google-MobWrite (se puede encontrar el enlace en la pregunta vinculada). – gamers2000

3

Como Gintautas señaló, esto se hace mediante transformación operativa. Según tengo entendido, la mayor parte de la investigación y el desarrollo de esta función se realizó como parte del ahora desaparecido proyecto Google Wave, y se conoce como el protocolo de onda. Afortunadamente, Google Wave es de código abierto, por lo que puede obtener algunas muestras de código buenas en http://code.google.com/p/wave-protocol/

+1

La mayor parte de la investigación y el desarrollo OT se realizó a finales de los años 80. –

13

No necesita xmpp u wave para esto necesariamente. La mayor parte del trabajo sobre una implementación de código abierto llamado infinote ya se ha realizado con jinfinote (https://github.com/sveith/jinfinote). Recientemente, Jinfinote también fue portado a Python (https://github.com/phrearch/py-infinote) para manejar la concurrencia y documentar el estado centralmente. Actualmente uso ambos dentro del proyecto hwios (https://github.com/phrearch/hwios), que se basa en websockets y json transport. No desea realmente utilizar encuestas para este tipo de aplicaciones. También xmpp parece complicar las cosas innecesariamente.

+1

+1 para el enlace a Jinfinote para las personas que desean implementar esto en el navegador. –

6

Después de abordar esta pregunta y hacer una búsqueda más cuidadosa, creo que la mejor aplicación independiente que se puede consultar es Etherpad, que se ejecuta como una aplicación de navegador JS y usa Node.js en el lado del servidor. La tecnología detrás de esto se conoce como operational transformation.

Etherpad fue originalmente una aplicación bastante pesada que fue comprada por Google e incorporada en Google Wave, que falló. El código fue lanzado como fuente abierta y la tecnología fue reescrita en Javascript para Etherpad Lite, ahora rebautizado como "Etherpad". Parte de la tecnología Etherpad probablemente también se incorporó a Google Docs.

Desde Etherpad, ha habido varias versiones de esta tecnología, en particular algunas librerías Javascript que permiten la integración de esta directamente en su aplicación web:

soy el mantenedor del paquete meteor-sharejs para agregar editores en tiempo real directamente a una aplicación Meteor, que en mi humilde opinión es lo mejor de ambos mundos :)

9

La edición colaborativa en tiempo real requiere varias cosas para ser efectiva. La mayoría de las otras respuestas aquí se enfocan solo en un aspecto del problema; a saber, estado distribuido (también conocido como estado mutable compartido). La Transformación Operacional (OT), los Tipos de Datos Replicados Libres de Conflicto (CRDT), la Sincronización Diferencial y otras tecnologías relacionadas son todos enfoques para lograr un estado distribuido casi en tiempo real. La mayoría se enfoca en la consistencia eventual, que permite las divergencias temporales de cada uno de los participantes, pero garantiza que cada estado de los participantes finalmente converge cuando se detiene la edición. Otras respuestas han mencionado varias implementaciones de estas tecnologías.

Sin embargo, una vez que haya compartido el estado mutable, necesita varias otras características para proporcionar una experiencia de usuario razonable. Ejemplos de estos conceptos adicionales incluyen:

  • Identidad: ¿Quién las personas que están colaborando, lo son.
  • Presencia: ¿Quién está editando actualmente "aquí" con usted ahora?
  • Comunicación: Chat, audio, vídeo, etc., que permiten a los usuarios para coordinar las acciones
  • Colaboración la orientación atencional: Características que dan indicaciones acerca de lo que los otros participantes están haciendo y/o están a punto de hacerlo.

Los cursores y las selecciones compartidos son ejemplos de Búsqueda colaborativa (a.k. un Conocimiento de colaboración). Ayudan a los usuarios a comprender las intenciones y las próximas acciones de los otros participantes. El póster original preguntaba en parte sobre la interacción entre el estado mutable compartido y el cueing colaborativo. Esto es importante porque la ubicación de un cursor o selección en un documento se describe típicamente a través de ubicaciones dentro del documento. El problema es que la ubicación de un cursor (por ejemplo) depende del contexto del documento. Cuando digo que mi cursor está en el índice 37, eso significa el carácter 37 en el documento que estoy viendo. El documento que puede tener en este momento puede ser diferente al mío, debido a sus ediciones o las de otros usuarios, y, por lo tanto, el índice 37 en su documento puede no ser correcto.

Por lo tanto, el mecanismo que utiliza para distribuir las ubicaciones del cursor debe integrarse de algún modo o al menos conocer el mecanismo del sistema que proporciona control de concurrencia sobre el estado mutable compartido. Uno de los desafíos actuales es que si bien existen muchas OT/CRDT, mensajería bidireccional, chat y otras bibliotecas, son soluciones aisladas que no están integradas. Esto dificulta la construcción de un sistema de usuario final que brinde una buena experiencia de usuario y, a menudo, genera desafíos técnicos que el desarrollador debe resolver.

En última instancia, para implementar un sistema eficaz de edición colaborativa en tiempo real, debe tener en cuenta todos estos aspectos; y ni siquiera hemos discutido historia, autorización, resolución de conflictos a nivel de aplicación y muchas otras facetas. Debe crear o encontrar tecnologías que respalden cada uno de estos conceptos de una manera que tenga sentido para su caso de uso. Entonces debes integrarlos.

La buena noticia es que las aplicaciones que admiten edición colaborativa son cada vez más populares. Las tecnologías que las respaldan están madurando y cada mes están disponibles nuevas. Firebase fue una de las primeras soluciones que intentó incluir muchos de estos conceptos en una API fácil de usar. Un recién llegado Convergence (descripción completa, soy fundador de Convergence Labs), proporciona una API todo en uno que admite la mayoría de estas facetas de edición colaborativa y puede reducir significativamente el tiempo, el costo y la complejidad de la creación en tiempo real aplicaciones colaborativas de edición.

0

que he publicado recientemente un repositorio con un ejemplo práctico de lo que parece que está tratando de lograr:

https://quill-sharedb-cursors.herokuapp.com

Se basa fuera ShareDB (OT) que trabaja como backend y Quill editor de texto enriquecido en la interfaz.

Básicamente solo cables todo esto con some more code to draw the cursors. El código debe ser bastante simple de entender y copiar a cualquier solución específica.

Espero que ayude con el esfuerzo.