Imagina una pizarra multijugador donde varias personas pueden dibujar al mismo tiempo. Para hacerlo simple, digamos que hay un solo objeto en la pizarra que cualquier usuario puede mover o eliminar. No hay ninguna noción de objetos de propiedad del usuario (es decir, es importante que cualquier usuario pueda manipular cualquier objeto ... es una pizarra libre)Condición de carrera de la pizarra multijugador
Mi problema es este ... si dos usuarios intentan hacer una acción diferente sobre el objeto al mismo tiempo, es decir, uno lo elimina, el otro lo mueve, ¿qué ocurre?
En este momento, al dejar que los mensajes pasen desapercibidos.
Una idea era tener un control en el servidor que resuelva quién tiene el control del objeto, y no se permite que nada suceda al cliente hasta que se resuelva ese conflicto. La resolución de conflictos se puede basar en el orden de llegada.
Aunque esto puede suceder muy rápido, la pequeña demora (~ 50-300ms) es inaceptable ya que el movimiento debe ser instantáneo en el lado del cliente. Por ejemplo, en lugar de manipular objetos, piense en un bolígrafo. Para que haya un retraso hasta que ya hayan empezado a dibujar ... ¡no es bueno!
Otra idea era tener un botón de "control de solicitud", que solicita la extensión en el servidor para controlar ... la misma idea que antes, pero ahora no se sienten frustrados por el retraso inicial del dibujo con bolígrafo. Esto tampoco es tan bueno, ya que deben presionar ese botón hasta que puedan hacer cualquier cosa, y esta pizarra es realmente para niños ...
¿Alguna otra solución? :)
¡Me gusta cómo ha señalado que el conflicto solo existe para cambios de propiedad específicos! es decir, el color y la posición no son un conflicto, pero la posición y posición o posición y eliminación son ... – davidkomer
Supongo que solo el nivel más simple, podría mantener un historial y "saltar hacia atrás y prohibir el control" si el servidor da un mensaje de objeto -locked ... – davidkomer
una resolución de conflicto simple con una manipulación de propiedad similar sería marcar la fecha de interacción del usuario y mantener el último cambio (o si el objeto se elimina simplemente mantenerlo eliminado) – dain