NOTA: La mayoría de los contenidos se toman del Informe del proyecto. Por lo tanto, también puede descargarlo desde los enlaces del cuadro desplegable que se encuentran en (También se pueden proporcionar los siguientes temas adicionales) Bloque. Simplemente puedes leerlo.
Marco de editor colaborativo en tiempo real
Introducción:
Un editor colaborativo es una forma de aplicación de software colaborativa que permite que varias personas editen un documento o un programa de forma colaborativa a través de una red informática. En la edición colaborativa en tiempo real, los usuarios pueden editar el mismo archivo simultáneamente, mientras que en la edición colaborativa en tiempo no real, los usuarios no editan el mismo archivo al mismo tiempo. Dado que hay una cantidad muy pequeña de soluciones de código abierto para lograr la edición colaborativa en cualquier aplicación web, tenemos la intención de desarrollar un marco en JavaScript a través del cual cualquier persona pueda lograr esta funcionalidad fácilmente. Para resolver el problema de la concurrencia en un marco de edición colaborativa de este tipo, utilizaremos la transformación operativa.
Además, para mejorar el enfoque tradicional, consideraremos el uso de una representación jerárquica del texto en lugar de la lineal. La operación en tiempo real es un aspecto importante a considerar en el diseño de editores colaborativos, ya que los usuarios deben poder ver el efectos de sus propias acciones inmediatamente y las de otros usuarios tan pronto como sea posible. Lo lograremos a través de sockets web.
El problema de la concurrencia en la edición colaborativa es un problema bien investigado. La gente ha sugerido un algoritmo de toma de turnos (Greenberg, 1991) que permite solo un participante activo a la vez. Tal algoritmo carece de concurrencia y bloquea el documento.
Otros enfoques como el bloqueo (Greenberg y Marwood, 1994) garantizan que los usuarios accedan a los objetos en el espacio de trabajo compartido de uno en uno. La edición simultánea solo está permitida si los usuarios están bloqueando y editando diferentes objetos.
El enfoque de transformación operativa se ha identificado como un enfoque adecuado para mantener la coherencia de las copias del documento compartido en los sistemas de edición colaborativa en tiempo real.
Google Wave, una herramienta de colaboración en tiempo real que ha estado en versión beta abierta durante los últimos meses.
El algoritmo treeOPT (Ignat y Norrie, 2003) mejora la transformación operativa al considerar la representación jerárquica del documento compartido en su trabajo de investigación.[2] Se afirma que el enfoque aumenta la eficiencia de la transformación operativa en comparación con los enfoques tradicionales.
Marco conceptual:
Metodología
Para garantizar una alta capacidad de respuesta, utilizaremos una arquitectura replicada en la que los usuarios trabajarán en su propia copia del documento compartido. Solo los cambios realizados se transmiten a otros usuarios.
Aquí está el flujo de control de dicha arquitectura:
- Cada colaborador tendrá una copia del documento compartido junto con el servidor.
- Siempre que se edite alguna de las copias compartidas, las operaciones se calculan y transmiten al servidor. Para garantizar la transmisión en tiempo real, aprovecharemos el poder de los sockets web.
- En caso de que diferentes usuarios estén actualizando diferentes partes del mismo documento, el servidor aplica los cambios a su copia y reenvía los cambios a otros colaboradores.
- En caso de que diferentes usuarios intenten actualizar la misma parte del documento (por ejemplo, tratando de agregar una string en la misma ubicación), es decir, se produce concurrencia, el servidor deberá resolver la condición de carrera y uno de los colaboradores podrá confirmar sus cambios. .
- Ahora comienza el problema real. La copia del servidor del documento y la copia de los otros clientes han divergido.
El problema anterior de la copia del servidor y la copia del cliente divergentes se puede representar a través de esta imagen. Supongamos que el servidor aplicó la operación b en el documento y el cliente aplicó la operación a en el documento. Esto ha provocado que ambas copias se «diverjan» entre sí. Para resolver el problema, o para “convergir” ambas copias a la misma versión, utilizaremos la transformación operativa.
La transformación operacional ajusta la operación a con respecto a b y la operación b con respecto a a. Los resultados finales deben ser tales que las operaciones ajustadas hagan converger las copias divergentes. Matemáticamente esto se puede escribir como:
OT(a, b) = (a', b') such that: apply(apply(str, a), b') = apply(apply(str, b)
En otras palabras, la función de transformación toma dos operaciones, un servidor y un cliente y produce un par de operaciones. Estas operaciones se pueden aplicar al estado final de su contraparte para producir exactamente el mismo estado cuando se completan. Como muestra la figura 2, después de aplicar la operación b’ a la copia del cliente y la operación a’ a la copia del servidor, ahora se encuentran en el mismo estado.
El uso de la transformación operativa en una representación lineal de texto no es muy eficiente. Para mejorar el rendimiento, utilizaremos el enfoque del algoritmo treeOPT. Representaremos el texto en orden jerárquico
El uso de la transformación operativa en una representación lineal de texto no es muy eficiente. Para mejorar el rendimiento, utilizaremos el enfoque del algoritmo treeOPT. Representaremos el texto en orden jerárquico.
En tal representación jerárquica, cada Node tiene su propia historia. La transformación operativa ahora se puede aplicar en el Node respectivo en lugar de en todo el documento. Esto reduce la sobrecarga de revisar el historial de todo el texto, ya que ahora solo tenemos que revisar el historial del Node respectivo.
Estructuras de datos y algoritmos
Algoritmo de transformación operacional de árbol
Definiciones
Node : A node N is a structure of the form N =, where Level: is a granularity level, level?{0, 1, 2, 3, 4}, corresponding to the element type represented by node (i.e. document, paragraph, sentence, word or character) Children: is an ordered list of nodes {child1, ..., childn}, level(childi)=level+1, for all i?{1, ..., n} Length : is the length of the node, Length = {1, if level = 4 ? length(childi), otherwise } History: is an ordered list of already executed operations on children nodes Content: is the content of the node, defined only for leaf nodes Content = { undefined, if level < 4 aCharacter, if level = 4 }
Composite Operation: A composite operation is a structure of the form cOp=, where: - Level: is a granularity level, level?{1, 2, 3, 4} Type: is the type of the operation, type?{Insertion, Deletion} Position: is a vector of positions position[i]= position for the ith granularity level, i?{1, ..., level} - content is a node representing the content of the operation StateVector: is the state vector of the generating site Initiator: is the initiator site identifier.
Dada una nueva operación compuesta causalmente lista, cOp, el Node raíz de la representación jerárquica de la copia local del documento, rootNode, y el número de niveles en la estructura jerárquica del documento, noLevels, se devuelve la forma de ejecución de cOp.
treeOPT(rootNode, cOp, noLevels) { currentNode = rootNode; for (l = 1; l <= noLevels; l++) onew = Composite2Simple(cOp, l); eonew = Transform(onew, history(currentNode)); position(cOp)[l] = position(eonew); if (level(cOp) = l) return cOp; currentNode = childi(currentNode), where i=position(eonew); }
Protocolo de comunicación cliente – servidor
Para garantizar una transferencia rápida de operaciones de un cliente a otro, utilizamos websockets entre el cliente y los servidores.
Para evitar sondear la base de datos en intervalos repetidos, usamos mongoDB, que nos permite suscribirnos a la transmisión en vivo de las tablas de la base de datos.
El cliente está hecho usando Java y el servidor está basado en nodejs. El servidor funciona en
$ node www { address: '0.0.0.0', family : 'IPv4', port: 3000 }
El cliente solicita al servidor que comparta el archivo, ahora el servidor compartirá el archivo a través de FileID presente en MongoDB. Luego agrega un usuario a la sesión del cliente solicitado usando el administrador de sesión y también puede eliminarlo.
Cada vez que el cliente realiza un cambio, las operaciones se envían a la recopilación de historial y el cliente espera el reconocimiento del servidor.
Si hay más cambios en el lado del cliente, se almacenan en el búfer hasta que llega el reconocimiento del servidor. Todos los cambios en el búfer se envían una vez que el servidor reconoce.
Herramientas utilizadas:
- Node.js: es un tiempo de ejecución de JavaScript basado en el motor de JavaScript V8 de Chrome. Node.js utiliza un modelo de E/S sin bloqueo y controlado por eventos que lo hace eficiente.
- MongoDB: es un programa de base de datos orientado a documentos multiplataforma gratuito y de código abierto. Clasificado como un programa de base de datos NoSQL, MongoDB utiliza documentos similares a JSON con esquemas.
- JavaFx: utilizado para crear la GUI del cliente.
- Robomongo: es una herramienta de administración de MongoDB multiplataforma centrada en shell. A diferencia de la mayoría de las otras herramientas de interfaz de usuario de administración de MongoDB, Robomongo incorpora el shell mongo real en una interfaz con pestañas con acceso a una línea de comando de shell, así como a la interacción con la GUI.
Aplicación:
un entorno de desarrollo integrado colaborativo en tiempo real puede proporcionar a los desarrolladores la posibilidad de colaborar en proyectos de software a través de una red, incluso cuando los desarrolladores están a miles de kilómetros de distancia. El IDE colaborativo en tiempo real brinda a los desarrolladores la capacidad de escribir código, compilarlo y probarlo en colaboración, así como compartir sus proyectos con otros desarrolladores. También es posible chatear con otros desarrolladores sobre un proyecto. Además de varias otras características útiles de un IDE completo, incluido el guardado de instantáneas, también se proporciona gestión de proyectos para facilitar todo el proceso de desarrollo del proyecto.
También se pueden proporcionar los siguientes temas adicionales:
1) Github : https://github.com/agnu13/Collaborative-Editor-client
Toda la descripción para ejecutar el proyecto se proporciona en el repositorio de github
2) Informe y presentación del proyecto – Documentos del proyecto
3) Base Paper – Algoritmo TreeOPT: editor colaborativo personalizable basado en el algoritmo treeOPT (Ignat y Norrie, 2003)
Referencias
- Imágenes: [1]. Divergencia de las copias del servidor y del cliente de la fuente en línea: http://www.codecommit.com/blog/java/understanding-and-applyingoperational-transformation
Citas:
- [1].Introducción a los editores colaborativos. De Wikipedia: https://en.wikipedia.org/wiki/Collaborative_real-time_editor
- [2]. A favor de la representación del árbol, extracto tomado de un trabajo de investigación sobre el algoritmo treeOPT: editor colaborativo personalizable que depende del algoritmo treeOPT (Ignat y Norrie, 2003)
- [3].Explicación de TO básico, extracto tomado de una fuente en línea: http://www.codecommit.com/blog/java/understanding-and-applyingoperational-transformation
Este artículo es una contribución de Akash Sharan . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA