Je souhaite que plusieurs utilisateurs modifient le même document. Le problème auquel je suis confronté est lorsqu'un nouvel utilisateur rejoint, il peut voir un document obsolète. Comment puis-je m'assurer que les nouveaux utilisateurs reçoivent les modifications les plus récentes?
Quelques solutions auxquelles j'ai pensé:
Économisez sur chaque changement. Je n'aime pas cette solution car elle ralentira les choses sur l'interface utilisateur et mettra la charge sur db.
Lorsqu'un nouvel utilisateur rejoint, déclenchez la sauvegarde sur tous les autres clients. Une fois les autres clients enregistrés, chargez le document. Avec cela, il peut encore y avoir des incohérences.
Toute autre suggestion serait utile.
MISE À JOUR: Après avoir examiné la solution suggérée, l'API Google Realtime, j'ai découvert que:
Les utilisateurs de votre application doivent disposer de Google Drive et vous donner accès à leur lecteur . Cela pourrait au mieux présenter un flux d'interface maladroit ou empêcher les utilisateurs qui n'ont pas Google Drive d'utiliser la fonctionnalité en temps réel.
Tous les paramètres de partage qui se font de votre côté doivent être répliqués pour le document Google.
MISE À JOUR 2: Pour atteindre l'objectif, je suis allé avec Firebase de Google
la source
Réponses:
Google Drive
Si vous essayez de créer votre propre version de Google Documents, je vous suggère de jeter un œil à l' API Google Realtime . Google a récemment publié cela dans le but de permettre à d'autres développeurs d'utiliser les mêmes outils qu'ils ont utilisés pour permettre une collaboration en temps réel. Cela vous permettrait de gagner du temps sur votre développement et d'obtenir un produit fonctionnel plus tôt.
Vous pouvez facilement prendre les données contenues dans le document et les insérer dans votre base de données à intervalles réguliers, ou faire en sorte que la base de données elle-même soit un «participant» de l'échange, simplement en écoutant et en enregistrant toutes les modifications. Il permet également à un utilisateur de définir ses propres structures de données qui sont ensuite utilisables dans l'API en temps réel, vous êtes donc libre de l'étendre comme bon vous semble.
Non-Google Drive
Donc, selon vos recherches, Google Drive n'est pas une option. C'est bien, mais ça va être plus difficile et peut-être ne pas fonctionner aussi bien, selon la quantité que vous y mettez.
Voici une stratégie générale que j'utiliserais pour résoudre ce problème:
Demandez au serveur d'être le multiplexeur de communication. Chaque personne parle au serveur et le serveur envoie ces informations à tout le monde. De cette façon, le serveur a toujours la vue la plus récente du document.
Trouvez un algorithme / module tiers pour la résolution des conflits. La résolution des conflits est difficile et n'est toujours pas parfaite. Faire cela seul pourrait facilement augmenter la portée du projet pour qu'il soit beaucoup trop important. Si vous ne pouvez pas utiliser un algorithme tiers, je vous suggère de n'autoriser qu'un seul utilisateur à modifier une zone de temps, de sorte que l'utilisateur doit obtenir un verrou avant de modifier une zone, ou vous risquez de détruire le travail d'un autre utilisateur, ce qui va devenir très vieux, très rapide.
Lorsqu'un nouvel utilisateur se joint à lui, donnez-lui le document le plus récent et lancez automatiquement la diffusion des commandes vers lui. Le serveur a la vue la plus récente et peut donc la diffuser automatiquement.
Sauvegarde dans la base de données à certains intervalles. Décidez de la fréquence à laquelle vous souhaitez sauvegarder (toutes les 5 minutes ou peut-être toutes les 50 modifications.) Cela vous permet de conserver la sauvegarde que vous souhaitez.
Problèmes: Ce n'est pas une solution parfaite, alors voici quelques problèmes auxquels vous pourriez être confrontés.
Le débit du serveur pourrait réduire les performances
Trop de personnes lisant / écrivant pourraient surcharger le serveur
Les personnes peuvent se désynchroniser si un message est perdu, vous pouvez donc vous assurer de vous synchroniser à des moments réguliers. Cela signifie envoyer à nouveau tout le message, ce qui peut être coûteux, mais sinon les gens pourraient ne pas avoir le même document et ne pas le savoir.
la source
Je recommanderais 1 copie persistante du document sur le serveur. Lorsqu'un client se connecte au serveur, vous émettez une ou plusieurs
UPDATE
commandes à ce client avec toutes les modifications.Mettre à jour WorkFlow
L'utilisateur provoque un changement de déclenchement -> Le client envoie
UPDATE
au serveur -> Le serveur envoieUPDATE
aux clientsDéclencheurs viables
Mettre à jour la mise en œuvre
Je suggérerais de pouvoir recréer le document avec une série de
UPDATE
commandes pour que le serveur stocke chaque MISE À JOUR et lorsqu'un nouveau client se connecte, le client peut recevoir la série de mises à jour et lui-même peut recréer le document à afficher l'utilisateur. En outre, vous pouvez également avoir uneSAVE
commande distincte et avoir UPDATE des modifications temporaires qui peuvent être utilisées pour lesUNDO
demandes et avoir SAVE réellement le stocker pour être rouvert si le serveur est fermé ou tous les clients se déconnectent.la source
1) Jetez un œil à Knockout.js
Il suit un modèle MVVM et envoie automatiquement des notifications à la vue en fonction des modifications apportées au modèle. Par exemple, regardez dans leur tableau observable pour fournir un peu plus d'informations sur la façon dont ils le font.
2) Mélangez cela avec SignalR et vous devriez maintenant avoir la possibilité d'envoyer des notifications aux autres utilisateurs travaillant sur le document. Depuis leur site:
Vous devrez donc avoir des crochets au niveau de votre modèle dans Knockout.js pour effectuer des appels SignalR chaque fois qu'un changement se produit. Les autres clients recevront la notification de SignalR, puis déclencheront un changement correspondant dans leur copie du modèle, qui repoussera à leur vue.
C'est une combinaison intéressante des deux cadres, et vous devriez être en mesure de rechercher et de recueillir plus d'informations pour gérer les détails.
Par exemple, cet exemple de projet de code traite spécifiquement de
Co Working UIs and Continuous Clients
ce qui semble être exactement ce que vous essayez de faire.Ce billet de blog semble être un point d'entrée dans une série de billets de blog discutant de l'utilisation des deux packages et contrastant avec une approche ASP.NET traditionnelle. Peut fournir quelques points à considérer lors de la conception de votre site.
Ce billet de blog semble être un peu plus basique et fournit les bases pour combiner les deux packages.
Divulgation: je ne suis affilié à aucun des liens ci-dessus et je n'ai pas vraiment fouillé dans leur contenu pour voir à quel point il est sain ou correct.
la source
La solution est la transformation opérationnelle (OT). Si vous n'en avez pas entendu parler, OT est une classe d'algorithmes qui utilisent la simultanéité multisite en temps réel. OT est comme git en temps réel. Il fonctionne avec n'importe quel décalage (de zéro à des vacances prolongées). Il permet aux utilisateurs d'effectuer des modifications simultanées en direct avec une faible bande passante. OT vous offre une cohérence éventuelle entre plusieurs utilisateurs sans nouvelles tentatives, sans erreurs et sans que les données soient écrasées.
Mais la mise en œuvre de l'OT est une tâche difficile et longue. Vous voudrez donc peut-être utiliser une bibliothèque externe comme http://sharejs.org/ .
la source
Cela dépend principalement du type de vos documents et de la façon dont vos utilisateurs collaborent.
Cependant, je voudrais:
Avantages:
Désavantages:
la source
Essentiellement, ce que vous demandez, c'est comment gérer un état mutable partagé. L'épargne est la partie facile; mais comment traitez-vous avec plusieurs personnes éditant la même chose en même temps? Vous souhaitez que tous les utilisateurs consultent le même document tout en synchronisant les modifications simultanées, le tout en temps réel.
Comme vous l'avez probablement compris, c'est un problème difficile! Il existe quelques solutions pragmatiques:
la source