Synchronisation des données dans les applications mobiles - plusieurs appareils, plusieurs utilisateurs


42

Je cherche à créer ma première application mobile. L’une des caractéristiques principales de l’application est que plusieurs appareils / utilisateurs auront accès aux mêmes données - et qu’ils auront tous les droits CRUD.

Je pense que l'architecture devrait impliquer un serveur central où toutes les données sont stockées. Les appareils utiliseront une API pour interagir avec le serveur afin d'effectuer ses opérations sur les données (par exemple, ajouter un enregistrement, modifier un enregistrement, supprimer un enregistrement).

J'imagine un scénario dans lequel la synchronisation des données deviendra un problème. Supposons que l'application fonctionne sans être connectée à Internet et ne peut donc pas communiquer avec ce serveur central. Alors:

  1. L'utilisateur A est hors ligne et modifie l'enregistrement # 100
  2. L'utilisateur B est hors ligne et modifie l'enregistrement # 100
  3. L'utilisateur C est hors ligne et supprime l'enregistrement n ° 100
  4. L'utilisateur C se met en ligne (vraisemblablement, l'enregistrement n ° 100 devrait être supprimé sur le serveur)
  5. Les utilisateurs A et B vont en ligne, mais les enregistrements qu'ils ont édités n'existent plus

Toutes sortes de scénarios similaires à ceux décrits ci-dessus peuvent se présenter.

Comment est-ce généralement traité? Je prévois d’utiliser MySQL, mais je me demande si cela ne convient pas à un tel problème.

Réponses:


30

Je travaille actuellement sur une application mobile / de bureau / distribuée avec exactement les mêmes exigences et les mêmes problèmes.

Premièrement, ces exigences ne sont pas inhérentes aux applications mobiles en elles-mêmes, mais à toutes les transactions client / serveur déconnectées / distribuées (programmation parallèle, multithreading, vous obtenez le point). En tant que tels, ils constituent bien sûr des problèmes typiques à résoudre dans les applications mobiles.

En gros, tout cela revient à dire que vous avez un enregistrement de données potentiel qui est distribué à n clients, qui peuvent le modifier en même temps. Ce dont tu as besoin c'est

  1. un mécanisme de contrôle / verrouillage de version approprié,
  2. une gestion des droits / accès appropriée,
  3. une stratégie de synchronisation / mise en cache appropriée

Pour (1) , vous pouvez appliquer certains modèles: Il existe deux stratégies de verrouillage fréquemment utilisés: Optimiste hors ligne de verrouillage , et Pessimiste Hors ligne de verrouillage . Certains d'entre eux sont appliqués dans différents "modèles" de contrôle de version, tels que le contrôle MVCC ( MultiVersion Concurrency Control ), qui utilise un compteur (sorte d'un "horodatage" très simple) pour chaque enregistrement de données, qui est mis à jour chaque fois que l'enregistrement est modifié. .

(2) et (3) sont des questions très vastes en elles-mêmes, qui doivent être traitées indépendamment de (1). Quelques conseils de mon expérience:

  • Utilisez une technologie client-serveur qui résout pour vous la plupart des problèmes. Je recommande fortement une technologie Web telle que CouchDb , qui gère très bien (1) via Optimistic Offline Locking + MVCC, (2) via Web API et (3) via la mise en cache Http.

  • Essayez de ne pas inventer des choses vous-même si vous pouvez compter sur des technologies et des approches éprouvées. Je crois que chaque heure passée à rechercher et à comparer les technologies / schémas existants est bien mieux dépensée que d'essayer de mettre en œuvre votre / vos système (s).

  • Essayez d'utiliser des technologies homogènes si possible. Par "homogène", j'entends des technologies conçues avec les mêmes principes, par exemple des scénarios d'utilisation du Web 2.0. Un exemple: utiliser un client CouchDb et REST approprié (API Web) avec une stratégie de mise en cache locale est un meilleur choix que d'utiliser SQL pour les applications mobiles.

  • Je déconseille fortement l’utilisation de MySQL car il s’agit d’une technologie qui n’était pas explicitement conçue pour de tels scénarios d’utilisation. Cela fonctionne, mais vous êtes beaucoup mieux avec un système de base de données qui intègre déjà le style de communication Web et de concurrence (tel que de nombreuses bases de données NoSQL).

En passant, j'ai opté pour CouchDb avec un client local personnalisé fonctionnant contre les API CouchDb, qui fonctionne et évolue à merveille. J'ai abandonné MSQL + (N) Hibernate et j'ai payé le prix fort pour ne pas avoir fait le bon choix (c'est-à-dire ne pas avoir fait assez de recherche).


+1 Le verrouillage optimiste et pessimiste a été la première chose qui me sautait à la tête en lisant le message de OP

10

Tout d'abord, vous avez mentionné à la fois une API et une base de données (MySQL). Je vous recommande vivement d'utiliser une API et de ne pas essayer de communiquer directement entre les bases de données. Ce dernier itinéraire ne sera pas du tout bon.

L’utilisation d’ Apache CouchDB est un bon point de départ . Il est sans schéma, basé sur HTTP et JSON, et dispose d'un très bon mécanisme de réplication. Nous l'utilisons pour résoudre un problème similaire.

Le mécanisme de réplication de CouchDB utilise la même API HTTP que tout autre client. Donc, essentiellement, il fournit la réplication sur une API.

Pour iOS, je recommande d'utiliser le projet Couchbase Lite . Cela fonctionne très bien pour la synchronisation des données. Pour Android, la même société qui réalise le projet susmentionné Couchbase Lite travaille sur une offre similaire - Couchbase Lite pour Android . Ce n'est pas aussi complet que la version iOS et il reste encore du travail à faire.

Cependant, il y a quelques points à considérer avec CouchDB.

  1. Vous devrez fournir votre propre résolution de conflit. Heureusement, en cas de conflit, CouchDB conserve les versions et les choix en conflit et les conflits arbitraires mais déterministes comme version principale. Vous pouvez donc envisager de retarder la résolution des conflits pour votre version initiale.
  2. Le mécanisme de réplication est conçu pour répliquer les bases de données, pas pour la synchronisation en soi. Donc, si vous avez beaucoup de documents supprimés, votre réplication du serveur vers le client prendra de plus en plus de temps. Il existe un moyen d'éviter cela en utilisant "rotation de la base de données". Cela supprime essentiellement les anciennes suppressions.
  3. Vous ne pouvez pas contrôler l'ordre de réplication. Vous pouvez toutefois trouver des solutions astucieuses pour améliorer les performances de réplication, telles que l’utilisation de la réplication filtrée pour obtenir certains documents en premier ou même l’accès direct au serveur à la demande.
  4. La réplication ne se fera pas en arrière-plan sur iOS. Vous pouvez utiliser le SDK iOS pour fournir certains cas de réplication en arrière-plan.

Enfin, si vous ne souhaitez pas utiliser CouchDB, vous pouvez au moins l'utiliser comme bonne référence pour créer un algorithme de synchronisation à l'aide d'une API HTTP. Ma suggestion serait de commencer par CouchDB, puis, si vous avez besoin de quelque chose de plus personnalisé, d’envisager le vôtre.


Mon plan pour l'API était d'implémenter une API RESTful à l'aide de CodeIgniter, qui interagirait avec la solution de base de données nécessaire. Je ne pensais pas utiliser un système de base de données doté d'une API intégrée. Est-ce que mon plan n'est pas d'accord avec votre réponse?
ProgrammerNewbie

De plus, je regarde maintenant CouchDB. Est-ce que je construirais l'application en utilisant seulement CouchDB? Ou utiliserais-je encore quelque chose comme MySQL avec CouchDB? Par exemple, l'application aura toujours besoin d'un SGBDR. Est-ce que je modélise ce type de données dans MySQL, puis je mets les données qui nécessitent une synchronisation dans CouchDB?
ProgrammerNewbie

Veuillez spécifier votre "besoin d'un SGBDR". Que prévoit-il que CouchDb ne le fait pas? CouchDb est une base de données NoSQL, vous n'avez donc pas besoin de MySQL supplémentaire. De plus, CouchDb peut vous mener loin sans couche intermédiaire, car vous pouvez intercepter les appels d'API à l'aide de JavaScript et créer votre sortie avec des vues.
Sébastien

@ProgrammerNewbie, il semble que votre plan soit généralement bon: prévoyez une API abstraite à partir de la base de données. CouchDB fait en quelque sorte cela, mais vous n’êtes pas complètement abstraite du fait que couchDB. En ce qui concerne votre deuxième question, je ne sais pas pourquoi vous avez besoin d’un SGBDR non plus. CouchDB fournit des vues de carte / réduction pour fournir des requêtes sur les données, les filtres, le suivi des modifications, etc.
David V

@Sebastian - Je ne connais tout simplement pas NoSQL. Je me demande donc si j'ai toujours besoin d'un SGBDR pour mes données relationnelles.
ProgrammerNewbie
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.