2009-08-27 7 views
3

Je travaille sur une application où le client et le serveur partagent un modèle d'objet, et les graphes d'objets peuvent devenir plutôt gros.calculer l'objet delta

Pour enregistrer un objet d'un client à un autre, idéalement, je souhaite envoyer uniquement la différence sur le réseau, afin de réduire le trafic réseau. Je peux tirer sur le graphique d'objets d'origine sur le serveur et d'appliquer le delta qu'il

Vous vous demandez s'il y a des outils ou des projets là-bas ou si quelqu'un a eu une expérience avec faire une telle chose ..

merci beaucoup

+0

J'ai également trouvé une [question similaire] (http://stackoverflow.com/q/8714463). – HappyNomad

+0

Et j'ai trouvé une autre [question similaire] (http://stackoverflow.com/q/1746864). – HappyNomad

Répondre

4

Lors d'un travail précédent, nous avions de grands modèles 3D que nous voulions partager entre les clients. Il aurait été impossible d'enregistrer les changements de modèle réels étant donné la taille du modèle et les restrictions de bande passante.

Au lieu d'envoyer l'ensemble du modèle modifié, nous avons choisi de sérialiser les opérations sur les données. Par exemple, une opération peut être {plan CUT: (pt1, pt2, pt3)} ou {DRILLHOLE (point, rayon, profondeur)}. Cela a très bien fonctionné pour notre application, bien que cela ne soit pas approprié pour votre modèle.

En outre, la suggestion de Matthew de calculer des hashs ou des timestamps est une bonne idée. Aussi, peut-être que vous pourriez garder une table de hachage de clés uniques afin que le serveur sache lesquels ont été supprimés et lesquels ont été ajoutés.

1

Vous pouvez économiser de la bande passante en donnant à vos objets la possibilité de calculer un hachage d'eux-mêmes en fonction de leurs valeurs de propriété. Comparez le hachage de l'objet serveur au hachage de l'objet client, s'il est différent, mettez à jour le hachage approprié.

+0

De même, vous pouvez utiliser un horodatage ou même un drapeau sale. –

0

Je prévois ma première architecture N-tier et je suis tombé sur cette question au moment où j'allais en publier une similaire. Tout l'exemple de code que j'ai vu jusqu'ici passe le graphique d'objet entier sur le fil chaque fois, sans tenir compte des changements qui ont été réellement faits. J'ai envisagé de prendre plutôt l'approche décrite ci-dessus. Bien, il semble que ce soit la route la moins fréquentée.

J'aime l'idée de ne renvoyer que les deltas pour chaque propriété modifiée. Pour les propriétés de collection, ce serait ce qui a été ajouté et supprimé. Pour une propriété à valeur unique, il pourrait s'agir simplement de la nouvelle valeur. Je pourrais l'implémenter d'une manière générale de sorte que l'accumulation de ces deltas soit transparente pour tous les objets du domaine. Et les deltas seraient envoyés sur le réseau sous une forme générale, sans utiliser les classes DTO spécifiques à mon modèle de domaine. Cela m'a fait me demander si je ne pouvais pas aller plus loin en utilisant la même structure de données delta à usage général pour la communication en direction du serveur vers le client. Après tout, vous pourriez avoir un delta qui remplit un objet vide. Ensuite, je pourrais éliminer complètement les classes DTO codées en dur. Je ai googlé "DTO génériques" (sans les guillemets) et trouvé this et this. On dirait que d'autres ont déjà appliqué l'idée dans la pratique.