web-dev-qa-db-fra.com

Stratégies de synchronisation des données avec le serveur dans PhoneGap

Je démarre mon premier projet PhoneGap, en utilisant AngularJS. C'est une application basée sur une base de données, utilisant une API REST comme backend. Pour commencer, je ne vais pas du tout stocker les données localement, donc cela ne fera pas grand chose sans Internet.

Cependant, j'aimerais éventuellement qu'il stocke les données localement et se synchronise quand Internet est disponible, car je sais que je désactive personnellement les connexions Internet sur mon téléphone à certains moments (avions, batterie faible) ou que je n'ai pas de barres. Je me demandais si vous pouviez me diriger vers de bonnes ressources pour ce type de synchronisation. Quelques bibliothèques recommandées? Ou peut-être quelques discussions sur les pièges et comment les contourner. J'ai googlé un peu, mais je pense que pour le moment, je ne connais pas les questions à poser.

De plus, mon intention de le construire d'abord en fonction d'Internet, puis d'ajouter la synchronisation ... Est-ce une bonne idée, ou je me tire une balle dans le pied? Dois-je le construire en synchronisant dès le départ?

J'ai proposé à quelqu'un de créer l'application en local uniquement, plutôt que la partie Internet en premier, ce qui a une certaine logique. Le stockage à distance est un peu important pour moi. Je sais que la décision a beaucoup à voir avec mes objectifs pour l'application, mais du point de vue de la construction, l'objectif final étant le stockage local + le stockage Internet et la synchronisation bidirectionnelle, qu'est-ce qui sera plus facile? Ou cela fait-il même une différence?

Pour commencer, je pense à utiliser des UUID plutôt que des clés primaires entières séquentielles. J'ai également pensé à attribuer à chaque appareil un ID préfixé sur toutes les clés qu'il génère, mais cela semble délicat. Quelqu'un a utilisé l'une ou l'autre technique? Pensées?

Je suppose que j'ai besoin d'un bon système pour dire quelles données ont été synchronisées. Du côté client, je suppose que tous les enregistrements qui sont créés/modifiés peuvent être marqués pour la synchronisation. Mais côté serveur, vous avez plusieurs clients, donc cela ne fonctionnerait pas. Je suppose que vous pourriez avoir un horodatage mis à jour et synchroniser tout ce qui a été mis à jour la dernière synchronisation réussie.

Qu'en est-il des enregistrements modifiés à plusieurs endroits? Si deux clients modifient, puis souhaitent synchroniser, vous avez une certaine ambiguïté sur la fusion, comme lors de la fusion de branches dans git ou d'autres systèmes de contrôle de version. Comment vas-tu prendre ça en charge? Je suppose que git le fait en stockant les différences de chaque commit. Je suppose que vous pourriez stocker des différences? Plus j'y pense, plus cela semble compliqué. Suis-je en train de trop le penser ou de le sous-penser?

Qu'en est-il du stockage côté client? J'ai pensé à SQLite, ou au système de stockage local PhoneGap ( http://docs.phonegap.com/en/1.2.0/phonegap_storage_storage.md.html ). Des recommandations? La synchronisation se fera sur une REST, échangeant JSON, donc je pensais que quelque chose qui stocke réellement les données en JSON, ou quelque chose comme JSON qui est facile à convertir, serait bien. d'autre part, si je dois échanger une sorte de format de données diff, c'est peut-être ce que je dois stocker?

31
eimajenthat

Permettez-moi de répondre à votre question sur la base de mon expérience liée à la partie de synchronisation, car je n'ai pas suffisamment d'expérience avec PhoneGap.

Je me demandais si vous pouviez me diriger vers de bonnes ressources pour ce type de synchronisation. Quelques bibliothèques recommandées?

Il existe un certain nombre de projets open source pour synchroniser l'application PhoneGap avec le serveur distant. Mais vous devrez probablement les ajuster à vos propres besoins ou implémenter votre propre fonctionnalité de synchronisation. Ci-dessous, j'ai énuméré certains des projets open-source. Vous devez déjà les connaître si vous recherchez sur le net.

En outre, vous pouvez envisager les autres options, mais cela dépend de votre côté serveur:

De plus, mon intention de le construire d'abord en fonction d'Internet, puis d'ajouter la synchronisation ... Est-ce une bonne idée, ou je me tire une balle dans le pied? Dois-je le construire en synchronisant dès le départ?

Je pense que la fonctionnalité de synchronisation ressemble plus à un module supplémentaire et ne devrait pas être étroitement associée au reste de votre logique métier. Une fois que vous aurez commencé à réfléchir à la stratégie de test pour votre synchronisation, vous vous rendrez compte qu'il sera plus facile de tester que si votre installation de synchronisation est découplée du code principal.

Je pense que vous pouvez lancer votre application dès que possible avec la fonctionnalité minimale requise sans synchronisation. Mais vous feriez mieux de penser à votre architecture et à la façon dont vous ajoutez la fonction de synchronisation à l'avance.

Pour commencer, je pense à utiliser des UUID plutôt que des clés primaires entières séquentielles. J'ai également pensé à attribuer à chaque appareil un ID préfixé sur toutes les clés qu'il génère, mais cela semble délicat. Quelqu'un a utilisé l'une ou l'autre technique? Pensées?

Cela dépend des spécifications de votre projet et en particulier de votre côté serveur. Par exemple, les services mobiles Azure autorisent uniquement le type entier pour les clés primaires. Bien que les identifiants uniques en tant que clés primaires soient assez pratiques dans les systèmes distribués (présentent également certains inconvénients).

Concernant l'attribution d'un ID d'appareil - je ne suis pas sûr de comprendre le point, même si je ne connais pas les détails de votre projet. Jetez un œil à l'algorithme de synchronisation utilisé dans notre système ( synchronisation bidirectionnelle en utilisant REST entre plusieurs Android et SQL Server central =).

Qu'en est-il des enregistrements modifiés à plusieurs endroits? Si deux clients modifient, puis souhaitent synchroniser, vous avez une certaine ambiguïté sur la fusion, comme lors de la fusion de branches dans git ou d'autres systèmes de contrôle de version. Comment vas-tu prendre ça en charge? Je suppose que git le fait en stockant les différences de chaque commit. Je suppose que vous pourriez stocker des différences? Plus j'y pense, plus cela semble compliqué. Suis-je en train de trop le penser ou de le sous-penser?

C'est là que vous devez réfléchir à la façon de gérer la résolution des conflits dans votre système.

Si la probabilité de conflits dans votre système sera élevée, par ex. les utilisateurs modifieront assez souvent les mêmes enregistrements. Ensuite, vous feriez mieux de suivre les champs (colonnes) des enregistrements qui ont été modifiés dans votre synchronisation, puis une fois le conflit détecté:

  1. Itérer dans chaque champ modifié de l'enregistrement côté serveur en conflit
  2. Comparez chaque champ modifié de l'enregistrement du serveur avec le champ correspondant du client.
  3. Si le champ client n'a pas été modifié, il n'y a pas de conflit, il suffit de le remplacer par celui du serveur.
  4. Dans le cas contraire, enregistrez le contenu des deux champs dans un emplacement temporaire pour le rapport
  5. À la fin de la synchronisation, produisez le rapport des enregistrements en conflit.
26
Havrl