En computación distribuida , un tipo de datos replicado sin conflictos ( CRDT ) es una estructura de datos que se replica en múltiples computadoras en una red , con las siguientes características: [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ]
- La aplicación puede actualizar cualquier réplica de forma independiente, simultánea y sin necesidad de coordinarse con otras réplicas.
- Un algoritmo (que forma parte del tipo de datos) resuelve automáticamente cualquier inconsistencia que pueda surgir.
- Aunque las réplicas pueden tener un estado diferente en un momento dado, está garantizado que eventualmente convergerán.
El concepto CRDT fue definido formalmente en 2011 por Marc Shapiro, Nuno Preguiça, Carlos Baquero y Marek Zawirski. [ 9 ] Su desarrollo se impulsó inicialmente por la edición colaborativa de textos y la informática móvil . Los CRDT también se han utilizado en sistemas de chat en línea , juegos de azar en línea y en la plataforma de distribución de audio SoundCloud . Las bases de datos distribuidas NoSQL Redis , Riak y Cosmos DB cuentan con tipos de datos CRDT.
Fondo
Las actualizaciones simultáneas de múltiples réplicas de los mismos datos, sin coordinación entre los equipos que las alojan, pueden generar inconsistencias entre ellas, que en la mayoría de los casos pueden ser irresolubles. Restablecer la coherencia y la integridad de los datos cuando existen conflictos entre las actualizaciones puede requerir la eliminación total o parcial de algunas o todas ellas.
En consecuencia, gran parte de la computación distribuida se centra en cómo prevenir las actualizaciones concurrentes de datos replicados. Sin embargo, existe otro enfoque posible: la replicación optimista , donde se permiten todas las actualizaciones concurrentes, pudiendo generarse inconsistencias, cuyos resultados se fusionan o resuelven posteriormente. En este enfoque, la coherencia entre las réplicas se restablece finalmente mediante la fusión de réplicas diferentes. Si bien la replicación optimista podría no funcionar en el caso general, existe una clase significativa y práctica de estructuras de datos, los CRDT, donde sí funciona : siempre es posible fusionar o resolver las actualizaciones concurrentes en diferentes réplicas de la estructura de datos sin conflictos. Esto convierte a los CRDT en ideales para la replicación optimista.
Por ejemplo, un indicador de evento booleano unidireccional es un CRDT trivial: un bit con un valor verdadero o falso. Verdadero significa que un evento en particular ha ocurrido al menos una vez. Falso significa que el evento no ha ocurrido. Una vez establecido en verdadero, el indicador no se puede volver a establecer en falso (un evento ocurrido no puede dejar de ocurrir). El método de resolución es "el verdadero gana": al fusionar una réplica donde el indicador es verdadero (esa réplica ha observado el evento) y otra donde el indicador es falso (esa réplica no ha observado el evento), el resultado resuelto es verdadero : el evento ha sido observado.
Tipos de CRDT
Hay dos enfoques para los CRDT, ambos pueden proporcionar una consistencia eventual fuerte : CRDT basados en estados [ 10 ] [ 11 ] y CRDT basados en operaciones. [ 12 ] [ 13 ]
CRDT basados en el estado
Los CRDT basados en estados (también llamados tipos de datos replicados convergentes o CvRDT ) se definen mediante dos tipos: uno para estados locales y otro para acciones sobre el estado, junto con tres funciones: una para generar un estado inicial , una para fusionar estados y otra para aplicar una acción que actualice un estado. Los CRDT basados en estados simplemente envían su estado local completo a otras réplicas en cada actualización, donde el nuevo estado recibido se fusiona con el estado local. Para garantizar la convergencia, las funciones deben cumplir las siguientes propiedades: la función de fusión debe calcular la unión para cualquier par de estados de réplica y debe formar un semirretículo con el estado inicial como elemento neutro. En particular, esto significa que la función de fusión debe ser conmutativa , asociativa e idempotente . La intuición detrás de la conmutatividad, la asociatividad y la idempotencia es que estas propiedades se utilizan para que el CRDT sea invariante ante la reordenación y duplicación de paquetes. Además, la función de actualización debe ser monótona con respecto al orden parcial definido por dicha semirretícula.
Los CRDT de estado delta [ 11 ] [ 14 ] (o simplemente CRDT delta) son CRDT basados en estados optimizados donde solo se difunden los cambios aplicados recientemente a un estado en lugar de todo el estado.
CRDT basados en operaciones
Los CRDT basados en operaciones (también llamados tipos de datos replicados conmutativos o CmRDT ) se definen sin una función de fusión. En lugar de transmitir estados, las acciones de actualización se transmiten directamente a las réplicas y se aplican. Por ejemplo, un CRDT basado en operaciones de un solo entero podría transmitir las operaciones "+10" o "−20". La aplicación de las operaciones debe seguir siendo conmutativa y asociativa . Sin embargo, en lugar de exigir que la aplicación de las operaciones sea idempotente , se esperan supuestos más estrictos sobre la infraestructura de comunicaciones: todas las operaciones deben entregarse a las demás réplicas sin duplicación.
Los CRDT basados en operaciones puras [ 13 ] son una variante de los CRDT basados en operaciones que reduce el tamaño de los metadatos.
Comparación
Las dos alternativas son teóricamente equivalentes, ya que cada una puede emular a la otra. [ 1 ] Sin embargo, existen diferencias prácticas. Los CRDT basados en estados suelen ser más sencillos de diseñar e implementar; su único requisito del sustrato de comunicación es algún tipo de protocolo de chismes . Su desventaja es que el estado completo de cada CRDT debe transmitirse eventualmente a todas las demás réplicas, lo que puede resultar costoso. En cambio, los CRDT basados en operaciones transmiten solo las operaciones de actualización, que suelen ser pequeñas. Sin embargo, los CRDT basados en operaciones requieren garantías del middleware de comunicación : que las operaciones no se pierdan ni se dupliquen al transmitirse a las demás réplicas, y que se entreguen en orden causal . [ 1 ]
Si bien los CRDT basados en operaciones imponen mayores requisitos al protocolo para la transmisión de operaciones entre réplicas, utilizan menos ancho de banda que los CRDT basados en estado cuando el número de transacciones es pequeño en comparación con el tamaño del estado interno. Sin embargo, dado que la función de fusión de los CRDT basados en estado es asociativa, la fusión con el estado de una réplica produce todas las actualizaciones anteriores de dicha réplica. Los protocolos de difusión funcionan bien para propagar el estado de los CRDT basados en estado a otras réplicas, al tiempo que reducen el uso de la red y gestionan los cambios de topología.
Se conocen algunos límites inferiores [ 15 ] sobre la complejidad de almacenamiento de los CRDT basados en estados.
CRDT conocidos
Contador G (Contador solo para crecimiento)
carga útil entero[n] P inicial [0,0,...,0] incremento de actualización () sea g = miId () P[g] := P[g] + 1 valor de consulta () : entero v sea v = Σi P[i] comparar (X, Y) : booleano b sea b = (∀i ∈ [0, n - 1] : XP[i] ≤ YP[i]) fusión (X, Y): carga útil Z sea ∀i ∈ [0, n - 1] : ZP[i] = max (XP[i], YP[i])
Este CRDT basado en estados implementa un contador para un clúster de n nodos. A cada nodo del clúster se le asigna un ID del 0 al n - 1, que se obtiene mediante una llamada a myId(). De este modo, a cada nodo se le asigna su propia ranura en el array P , que incrementa localmente. Las actualizaciones se propagan en segundo plano y se fusionan tomando el max()de cada elemento de P. La función de comparación se incluye para ilustrar un orden parcial en los estados. La función de fusión es conmutativa, asociativa e idempotente. La función de actualización incrementa monótonamente el estado interno según la función de comparación. Por lo tanto, se trata de un CRDT basado en estados correctamente definido y que proporcionará una fuerte consistencia eventual. El CRDT equivalente basado en operaciones difunde las operaciones de incremento a medida que se reciben. [ 2 ]
Contador PN (Contador positivo-negativo)
carga útil entero[n] P, entero[n] N inicial [0,0,...,0], [0,0,...,0]incremento de actualización () sea g = miId () P[g] := P[g] + 1decremento de actualización () sea g = miId () N[g] := N[g] + 1valor de consulta () : entero v sea v = Σi P[i] - Σi N[i] comparar (X, Y) : booleano b sea b = (∀i ∈ [0, n - 1] : XP[i] ≤ YP[i] ∧ ∀i ∈ [0, n - 1] : XN[i] ≤ YN[i]) fusión (X, Y): carga útil Z sea ∀i ∈ [0, n - 1] : ZP[i] = max (XP[i], YP[i]) sea ∀i ∈ [0, n - 1] : ZN[i] = max (XN[i], YN[i])
Una estrategia común en el desarrollo de CRDT consiste en combinar varios CRDT para crear uno más complejo. En este caso, se combinan dos contadores G para crear un tipo de dato que admite operaciones de incremento y decremento. El contador G "P" cuenta los incrementos, y el contador G "N" cuenta los decrementos. El valor del contador PN es el valor del contador P menos el valor del contador N. La fusión se gestiona haciendo que el contador P fusionado sea la fusión de los dos contadores G P, y de forma similar para los contadores N. Cabe destacar que el estado interno del CRDT debe incrementarse monótonamente, aunque su estado externo, expuesto mediante consulta, pueda volver a valores anteriores. [ 2 ]
Conjunto G (conjunto solo para crecimiento)
Conjunto de carga útil A ∅ inicial actualizar agregar (elemento e) A := A ∪ {e}consulta de búsqueda (elemento e): booleano b sea b = (e ∈ A) comparar (S, T) : booleano b sea b = (SA ⊆ TA) fusión (S, T): carga útil U sea UA = SA ∪ TAEl G-Set (conjunto de solo crecimiento) es un conjunto que solo permite adiciones. Un elemento, una vez añadido, no se puede eliminar. La fusión de dos G-Sets es su unión. [ 2 ]
Conjunto 2P (conjunto de dos fases)
Conjunto de carga útil A, conjunto R ∅ inicial, ∅consulta de búsqueda (elemento e): booleano b sea b = (e ∈ A ∧ e ∉ R) actualizar agregar (elemento e) A := A ∪ {e} actualizar eliminar (elemento e)búsqueda previa (e) R := R ∪ {e} comparar (S, T) : booleano b sea b = (SA ⊆ TA ∨ SR ⊆ TR) fusión (S, T): carga útil U sea UA = SA ∪ TA sea UR = SR ∪ TRDos conjuntos G (conjuntos de solo crecimiento) se combinan para crear el conjunto 2P. Con la adición de un conjunto de eliminación (llamado conjunto "lápida"), se pueden agregar y eliminar elementos. Una vez eliminado, un elemento no se puede volver a agregar; es decir, una vez que un elemento e está en el conjunto de lápida, la consulta nunca volverá a devolver True para ese elemento. El conjunto 2P utiliza la semántica "eliminar gana", por lo que tiene precedencia sobre . [ 2 ]remove(e)add(e)
Conjunto de elementos LWW (Elemento que prevalece en la última escritura)
LWW-Element-Set es similar a 2P-Set en que consta de un "conjunto de adición" y un "conjunto de eliminación", con una marca de tiempo para cada elemento. Los elementos se agregan a un LWW-Element-Set insertándolos en el conjunto de adición, con su correspondiente marca de tiempo. Los elementos se eliminan del LWW-Element-Set agregándolos al conjunto de eliminación, también con su correspondiente marca de tiempo. Un elemento pertenece al LWW-Element-Set si está en el conjunto de adición y no en el conjunto de eliminación, o si está en el conjunto de eliminación pero con una marca de tiempo anterior a la última marca de tiempo del conjunto de adición. La fusión de dos réplicas del LWW-Element-Set consiste en tomar la unión de los conjuntos de adición y la unión de los conjuntos de eliminación. Cuando las marcas de tiempo son iguales, entra en juego el "sesgo" del LWW-Element-Set. Un LWW-Element-Set puede estar sesgado hacia las adiciones o las eliminaciones. La ventaja de LWW-Element-Set sobre 2P-Set es que, a diferencia de 2P-Set, LWW-Element-Set permite reinsertar un elemento después de haber sido eliminado. [ 2 ]
Conjunto OR (Observado-Eliminar conjunto)
OR-Set se asemeja a LWW-Element-Set, pero utiliza etiquetas únicas en lugar de marcas de tiempo. Para cada elemento del conjunto, se mantiene una lista de etiquetas de adición y una lista de etiquetas de eliminación. Un elemento se inserta en OR-Set generando una nueva etiqueta única y añadiéndola a la lista de etiquetas de adición del elemento. Los elementos se eliminan de OR-Set añadiendo todas las etiquetas de la lista de etiquetas de adición del elemento a su lista de etiquetas de eliminación (lista de eliminación). Para fusionar dos OR-Sets, para cada elemento, su lista de etiquetas de adición es la unión de las dos listas de etiquetas de adición, y lo mismo ocurre con las dos listas de etiquetas de eliminación. Un elemento es miembro del conjunto si y solo si la lista de etiquetas de adición menos la lista de etiquetas de eliminación no está vacía. [ 2 ] Es posible una optimización que elimina la necesidad de mantener un conjunto de etiquetas de eliminación; esto evita el crecimiento potencialmente ilimitado del conjunto de etiquetas de eliminación. La optimización se logra manteniendo un vector de marcas de tiempo para cada réplica. [ 16 ]
CRDT de secuencia
Se puede utilizar una secuencia, lista o conjunto ordenado CRDT para construir un editor colaborativo en tiempo real , como alternativa a la transformación operacional (OT).
Algunos CRDT de secuencia conocidos son Treedoc, [ 5 ] RGA, [ 17 ] Woot, [ 4 ] Logoot, [ 18 ] y LSEQ. [ 19 ] CRATE [ 20 ] es un editor descentralizado en tiempo real construido sobre LSEQSplit (una extensión de LSEQ) y ejecutable en una red de navegadores usando WebRTC . LogootSplit [ 21 ] fue propuesto como una extensión de Logoot para reducir los metadatos para CRDT de secuencia. MUTE [ 22 ] [ 23 ] es un editor colaborativo en línea peer-to-peer en tiempo real basado en la web que se basa en el algoritmo LogootSplit.
Se sabe que los CRDT de secuencia industrial, incluidos los de código abierto, superan a las implementaciones académicas debido a optimizaciones y una metodología de prueba más realista. [ 24 ] El principal ejemplo popular es el CRDT Yjs, pionero en el uso de una lista simple en lugar de un árbol (al estilo de la automerge de Kleppmann ). [ 25 ]
Uso industrial
- Fluid Framework es una plataforma colaborativa de código abierto creada por Microsoft que proporciona implementaciones de referencia del servidor y SDK del lado del cliente para crear aplicaciones web modernas en tiempo real utilizando CRDT.
- Nimbus Note es una aplicación colaborativa para tomar notas que utiliza el CRDT de Yjs para la edición colaborativa. [ 26 ]
- Redis es una base de datos en memoria distribuida, de alta disponibilidad y escalable con una característica de "base de datos habilitada para CRDT". [ 27 ]
- SoundCloud publicó Roshi como código abierto, un CRDT de conjunto de elementos LWW para el flujo de SoundCloud implementado sobre Redis. [ 28 ]
- Riak es un almacén de datos NoSQL distribuido de clave-valor basado en CRDT. [ 29 ] League of Legends utiliza la implementación de Riak CRDT para su sistema de chat dentro del juego, que maneja 7,5 millones de usuarios concurrentes y 11 000 mensajes por segundo. [ 30 ]
- Bet365 almacena cientos de megabytes de datos en la implementación de Riak de OR-Set. [ 31 ]
- TomTom emplea CRDT para sincronizar los datos de navegación entre los dispositivos de un usuario. [ 32 ]
- Phoenix , un framework web escrito en Elixir , utiliza CRDT para admitir el intercambio de información multinodo en tiempo real en la versión 1.2. [ 33 ]
- Facebook implementa CRDT en su base de datos Apollo de baja latencia y "consistencia a escala". [ 34 ]
- Facebook utiliza CRDT en su sistema FlightTracker para gestionar internamente el gráfico de Facebook. [ 35 ]
- Teletype para Atom emplea CRDT para permitir a los desarrolladores compartir su espacio de trabajo con los miembros del equipo y colaborar en el código en tiempo real. [ 36 ]
- Apple implementa CRDT en la aplicación Notas para sincronizar ediciones sin conexión entre varios dispositivos. [ 37 ]
- Novell, Inc. introdujo un CRDT basado en estados con replicación de directorio "vagamente consistente" ( NetWare Directory Services), incluido en NetWare 4.0 en 1995. [ 38 ] El producto sucesor, eDirectory, ofreció mejoras en el proceso de replicación. [ 39 ]
- La edición multijugador en tiempo real de Figma utiliza un esquema de replicación con autoridad del servidor y por propiedad, en el que gana el último escritor (similar a un registro LWW en la literatura CRDT); para secuencias ordenadas (por ejemplo, ordenación de capas) utiliza indexación fraccionaria con desempate del servidor para inserciones concurrentes (en lugar de transformaciones de estilo operacional ). [ 40 ] [ 41 ]
- AutoMerge es una biblioteca de código abierto que ofrece varias CRDT en JavaScript y Rust, un formato de compresión y un protocolo de sincronización.
Véase también
Referencias
- 1 2 3 Shapiro, Marc; Preguiça, Nuno; Baquero, Carlos; Zawirski, Marek (2011). «Tipos de datos replicados sin conflictos». Estabilización, seguridad y protección de sistemas distribuidos (PDF) . Notas de clase en informática. Vol. 6976. Grenoble, Francia: Springer Berlin Heidelberg. pp. 386–400 . doi : 10.1007/978-3-642-24550-3_29 . ISBN 978-3-642-24549-7. S2CID 51995307 .
- 1 2 3 4 5 6 7 Shapiro, Marc; Preguiça, Nuno; Baquero, Carlos; Zawirski, Marek (13 de enero de 2011). "Un estudio completo de tipos de datos replicados convergentes y conmutativos". Rr-7506 .
- ^ Shapiro, Marc; Preguiça, Nuno (2007). "Diseño de un tipo de datos replicados conmutativos". arXiv : 0710.1784 [ cs.DC ].
- 1 2 Oster, Gérald; Urso, Pascal; Molli, Pascal; Imine, Abdessamad (2006). Actas de la conferencia del 20.º aniversario de 2006 sobre trabajo cooperativo asistido por ordenador - CSCW '06 . pág. 259. CiteSeerX 10.1.1.554.3168 . doi : 10.1145/1180875.1180916 . ISBN 978-1595932495. S2CID 14596943 .
- 1 2 Letia, Mihai; Preguiça, Nuno; Shapiro, Marc (2009). "CRDTs: Consistencia sin control de concurrencia". Computing Research Repository . arXiv : 0907.0929 .
- ↑ Preguiça, Nuno; Marques, Joan Manuel; Shapiro, Marc; Letia, Mihai (junio de 2009), "Un tipo de datos replicados conmutativos para la edición cooperativa" (PDF) , Actas de la 29.ª Conferencia Internacional IEEE sobre Sistemas de Computación Distribuida , Montreal, Quebec, Canadá: IEEE Computer Society, págs. 395–403 , doi : 10.1109/ICDCS.2009.20 , ISBN 978-0-7695-3659-0, S2CID 8956372
- ↑ Baquero, Carlos; Moura, Francisco (1997), Especificación de tipos de datos abstractos convergentes para computación móvil autónoma , Universidade do Minho
- ↑ Schneider, Fred (diciembre de 1990). "Implementación de servicios tolerantes a fallos mediante el enfoque de máquina de estados: un tutorial" . ACM Computing Surveys . 22 (4): 299–319 . doi : 10.1145/98163.98167 . S2CID 678818 .
- ↑ "Tipos de datos replicados sin conflictos" . inria.fr. 19 de julio de 2011.
- ↑ Baquero, Carlos; Moura, Francisco (1 de octubre de 1999). "Uso de características estructurales para la operación autónoma". SIGOPS Oper. Syst. Rev. 33 ( 4): 90– 96. doi : 10.1145/334598.334614 . hdl : 1822/34984 . S2CID 13882850 .
- 1 2 Almeida, Paulo Sérgio; Shoker, Ali; Baquero, Carlos (2015-05-13). "CRDTS eficiente basado en estados mediante mutación delta". En Bouajjani, Ahmed; Fauconnier, Hugues (eds.). Sistemas en red . Notas de clase en informática. Vol. 9466. Springer International Publishing. pp. 62–76 . arXiv : 1410.2803 . doi : 10.1007/978-3-319-26850-7_5 . ISBN 9783319268491. S2CID 7852769 .
- ↑ Letia, Mihai; Preguiça, Nuno; Shapiro, Marc (1 de abril de 2010). "Consistencia sin control de concurrencia en sistemas dinámicos grandes" (PDF) . SIGOPS Oper. Syst. Rev. 44 ( 2): 29– 34. doi : 10.1145/1773912.1773921 . S2CID 6255174 .
- 1 2 Baquero, Carlos; Almeida, Paulo Sérgio; Shoker, Ali (2014-06-03). "Making Operation-Based CRDTS Operation-Based". En Magoutis, Kostas; Pietzuch, Peter (eds.). Distributed Applications and Interoperable Systems . Lecture Notes in Computer Science. Vol. 8460. Springer Berlin Heidelberg. pp. 126–140 . CiteSeerX 10.1.1.492.8742 . doi : 10.1007/978-3-662-43352-2_11 . ISBN 9783662433515.
- ↑ Almeida, Paulo Sergio; Shoker, Ali; Baquero, Carlos (4 de marzo de 2016). "Tipos de datos replicados del estado delta". Revista de Computación Paralela y Distribuida . 111 : 162–173 . arXiv : 1603.01529 . doi : 10.1016/j.jpdc.2017.08.003 . S2CID 7990602 .
- ↑ Burckhardt, Sebastian; Gotsman, Alexey; Yang, Hongseok; Zawirski, Marek (23 de enero de 2014). «Tipos de datos replicados: especificación, verificación, optimalidad». Actas del 41.º Simposio ACM SIGPLAN-SIGACT sobre principios de lenguajes de programación (PDF) . págs. 271–284 . doi : 10.1145/2535838.2535848 . ISBN 9781450325448. S2CID 15023909 .
- ^ Bieniusa, Annette; Zawirski, Marek; Preguiça, Nuno; Shapiro, Marc; Baquero, Carlos; Balegas, Valter; Duarte, Sergio (2012). "Un conjunto replicado optimizado y libre de conflictos". arXiv : 1210.3368 [ cs.DC ].
- ↑ Roh, Huyn-Gul; Jeon, Myeongjae; Kim, Jin-Soo; Lee, Joonwon (2011). "Tipos de datos abstractos replicados: bloques de construcción para aplicaciones colaborativas". Journal of Parallel and Distributed Computing . 71 (2): 354– 368. doi : 10.1016/j.jpdc.2010.12.006 .
- ↑ Weiss, Stephane; Urso, Pascal; Molli, Pascal (2010). "Logoot-Undo: Sistema de edición colaborativa distribuida en redes P2P". IEEE Transactions on Parallel and Distributed Systems . 21 (8): 1162– 1174. Bibcode : 2010ITPDS..21.1162W . doi : 10.1109/TPDS.2009.173 . ISSN 1045-9219 . S2CID 14172605 .
- ↑ Nédelec, Brice; Molli, Pascal; Mostefaoui, Achour; Desmontils, Emmanuel (2013). «LSEQ: Una estructura adaptativa para secuencias en la edición colaborativa distribuida». Actas del simposio ACM de 2013 sobre ingeniería de documentos (PDF) . págs. 37–46 . doi : 10.1145/2494266.2494278 . ISBN 9781450317894. S2CID 9215663 .
- ↑ Nédelec, Brice; Molli, Pascal; Mostefaoui, Achour (2016). "CRATE: Escribiendo historias junto con nuestros navegadores". Actas de la 25.ª Conferencia Internacional sobre la World Wide Web . p. 231. doi : 10.1145/2872518.2890539 . S2CID 5096789. Archivado del original el 1 de enero de 2020. Consultado el 1 de enero de 2020 .
- ↑ André, Luc; Martin, Stéphane; Oster, Gérald; Ignat, Claudia-Lavinia (2013). «Apoyo a la granularidad adaptable de los cambios para la edición colaborativa a gran escala». Actas de la Conferencia Internacional sobre Computación Colaborativa: Redes, Aplicaciones y Trabajo Compartido – CollaborateCom 2013. pp. 50–59 . doi : 10.4108/icst.collaboratecom.2013.254123 . ISBN 978-1-936968-92-3.
- ↑ "SILENCIAR" . Equipo de la Costa. 24 de marzo de 2016.
- ^ Nicolás, Matthieu; Elvinger, Victorien; Oster, Gerald; Ignat, Claudia-Lavinia; Charoy, François (2017). "MUTE: un editor colaborativo en tiempo real basado en la web de igual a igual". Actas de los paneles, demostraciones y carteles de la ECSCW 2017 . doi : 10.18420/ecscw2017_p5 . S2CID 43984228 .
- ↑ Gentle, Seph. "CRDT más rápidos: una aventura en optimización" . josephg.com . Consultado el 1 de agosto de 2021 .
- ↑ "yjs/yjs: Tipos de datos compartidos para la creación de software colaborativo" . GitHub .
- ↑ "Acerca de los CRDT" . Consultado el 18 de junio de 2020 .
- ↑ "Profundizando en los CRDT" . Redis . 17 de marzo de 2022. Consultado el 22 de mayo de 2024 .
- ↑ Bourgon, Peter (9 de mayo de 2014). "Roshi: un sistema CRDT para eventos con marca de tiempo" . SoundCloud.
- ↑ "Presentamos Riak 2.0: Tipos de datos, consistencia sólida, búsqueda de texto completo y mucho más" . Basho Technologies, Inc. 29 de octubre de 2013.
- ↑ Hoff, Todd (13 de octubre de 2014). "Cómo League of Legends escaló el chat a 70 millones de jugadores: se necesitan muchos súbditos" . Alta escalabilidad .
- ^ Macklin, Dan. "bet365: Por qué bet365 eligió Riak" . Basho.
- ↑ Ivanov, Dmitry. "Desmitificación práctica de los CRDT" .
- ↑ McCord, Chris (25 de marzo de 2016). "Lo que hace especial a Phoenix Presence" .
- ^ Mak, Sander. "Facebook anuncia Apollo en QCon NY 2014" .
- ↑ "FlightTracker: Consistencia entre las tiendas online optimizadas para la lectura en Facebook" . research.facebook.com . Consultado el 8 de diciembre de 2022 .
- ↑ "Codifica en tiempo real con Teletype para Atom" . Atom.io. 15 de noviembre de 2017.
- ↑ "Clasificaciones de encabezado de Objective-C para IOS derivadas de la introspección en tiempo de ejecución: NST/IOS-Runtime-Headers" . GitHub . 25 de julio de 2019.
- ↑ "Comprensión de los servicios de directorio de NetWare" . support.novell.com . Consultado el 2 de noviembre de 2024 .
- ↑ "Sincronización de eDirectory y procesos en segundo plano" . support.novell.com . Consultado el 2 de noviembre de 2024 .
- ↑ "Cómo funciona la tecnología multijugador de Figma" . Blog de Figma . Consultado el 2 de enero de 2026 .
- ↑ "Edición en tiempo real de secuencias ordenadas" . Blog de Figma . Consultado el 2 de enero de 2026 .
Enlaces externos
- Una colección de recursos y documentos sobre CRDT.
- "Consistencia eventual fuerte y tipos de datos replicados sin conflictos" (una charla sobre CRDT) por Marc Shapiro
- Lecturas sobre tipos de datos replicados sin conflictos por Christopher Meiklejohn
- Teorema CAP y CRDT: CAP 12 años después. Cómo han cambiado las reglas, por Eric Brewer.
- Estructuras de datos distribuidas
- Algoritmos distribuidos
- Sistemas informáticos tolerantes a fallos