Micro-canal cadre mobile multi-plateforme WCDB base de données Open Source

Auteur | sanhuazhang

Modifier | Ash

En GMTC 2017 Mobile World Congress sur ingénieur hier, Android haut de la micro-lettre Il Junwei à faire la pratique de récupération corruption de base de données partage SQLite micro-canal, et le cadre mobile multiplateforme annoncé WCDB base de données open source à l'Assemblée générale.

Nous arrivons ici

Aujourd'hui, WCDB (WeChat Database) de l'examen final par la société, pour tout le monde à part Tencent micro lettre en tant que composants open source.

De WCDB d'abord construit, de continuer à explorer, optimize, puis d'organiser le code, la documentation, et enfin la regarda attendant tranquillement la « Rendre public » est pressé, l'ambiance est comme regarder sa fille se marie père sur GitHub. Profitez de cette occasion, il suffit de regarder à la croissance WCDB cette « base de données micro-canal » pour partager notre chemin spirituel, mais aussi l'espoir de laisser tout le monde savoir plus sur WCDB.

Explorez leur

Le premier micro-canal, chaque plate-forme, en plus de « utiliser SQLite » ce consensus, essentiellement leur manière.

Avec le support de la plate-forme Android SDK fournit adéquate et l'utilisation des inconvénients du développement NDK, la sélection naturelle du développement de l'interface API du système.

la situation iOS est différente. système d'apprentissage CoreData fournit un coût élevé, la performance en général, n'est pas si facile à utiliser. Donc, encore une fois à l'étude, nous avons décidé de conditionner son propre ensemble d'interfaces, nommé WCDB, WeChat Database.

iOS papiers

WCDB FMDB emballage au départ et similaires, sont des interfaces de chaîne directement exposées, de sorte que leur chaîne d'épissage de développement commercial, attribué à l'objet correspondant enlevé après que les données. Sur la gestion du fil, le fil à travers la serrure, de sorte que l'accès série tous les fils d'exécution, afin d'assurer la sécurité des threads.

Cependant, cette approche est trop simple et brut, de sorte que nous nous utilisons tous se sentent très inquiétez pas.

Code colle

Ouverte et les affaires WCDB couche adhésive, une fonction de plusieurs dizaines de lignes, le plus souvent l'épissage SQL, le traitement des données nulles et des codes d'erreur sont retournés SQLite comme code « de liaisons ». Et ce code est de quatre distribution sont écrites entre les lignes « Copier et coller ».

inefficace

basée sur une chaîne SQL, les amateurs de ligne de commande de Jinki. Mais pour les développeurs mobiles IDE modernes, mais il est une grande douleur. Les chaînes ne reçoivent aucune vérification du compilateur, le développement des affaires est souvent le cur d'un groupe de Miami, tiré de lettres quelques centaines de lignes de code, plein de joie après le point découverte Run: faux!

La méditation progressivement vers le bas pour voir le journal, un point d'arrêt après la découverte, oh, SELECT a frappé dans la SLEECT. Corriger, puis attendre la fin de la traduction, cette fois au cours des dix dernières minutes, le cur de Miami a été éteint longtemps, mais aussi parler de l'efficacité?

injection SQL

Avec le développement des affaires micro-canal, les questions de sécurité sont de plus en plus d'importance. base de données du serveur de base de données client, mais pas si facile d'être lorgne les méchants, mais dans une si grande quantité de corps micro-canal, le cur ne doit pas être Fangzei pas.

injection SQL utilisent généralement des caractéristiques de concaténation de chaîne SQL, avec des symboles spéciaux troncature avance SQL, pour atteindre l'objectif d'effectuer d'autres SQL. Imaginez un morceau de code:

Ce forfait est très simple, le contenu du message doit être inséré dans la base de données. Supposons que l'autre partie d'envoyer un tel message: « ); DELETE FROM message; -, alors ce sera tronqué à SQL trois parties:

Il insérerait plus tard un message, supprimer tous les messages dans le tableau. Si la mémoire micro-canal dans une telle échappatoire, les conséquences seraient désastreuses.

En fait, anti-implantation est pas difficile, double guillemets simples peuvent être résolus en se liant les paramètres ou remplacer des guillemets simples. Mais nous devons toujours faire preuve de vigilance dans le processus du développement commercial du risque tel, il est peu réaliste, après tout, les gens vont faire des erreurs.

Caton fréquente

Comme la quantité de la messagerie micro-canal est en croissance, de sorte que quand une pluralité de fils parallèles série de vue simultanément, ce qui provoque le blocage de l'autre.

En même temps, dans certains des micro-canal a créé une nouvelle demande: la sauvegarde des chats.

chats de sauvegarde continueront de lire le chat sur le téléphone, et transmis au PC / Mac micro lettre. En d'autres termes, dans un seul thread continuera à bloquer la base de données. Cela affectera directement l'envoi de l'utilisateur et de recevoir et consulter l'historique des chats.

Est-il temps de sauvegarde de données d'utilisateur, vous ne pouvez pas utiliser la lettre de micro? Il est clair que réaliste.

Donc, nous avons laissé WCDB terminé une évolution.

Discussion concurrency

WCDB construit une poignée de la piscine, l'accès sera basé sur différents threads, gestion de la distribution dynamique poignée de SQLite, de manière à atteindre lire et lire et lire et à écrire effet simultané. En fonction de la mise en uvre de SQLite, qui écrit l'opération d'écriture série est toujours, mais dans une opération, une autre opération par le sommeil - pour le mode de nouvelle tentative, et donc pas le nec plus ultra de la performance.

Le WCDB en optimisant le code source, de sorte que l'opération d'écriture est terminée, la première fois de se réveiller un autre thread à utiliser, plus les performances de compression.

A propos des détails de l'optimisation, on peut se référer à une action avant --- .

package SQL

WCDB par encapsulation macro, de sorte que le type de définition du champ de service et dans la classe. WCDB par macro enregistre ces informations dans le CRUD suivant. Cela est devenu WCDB de forme ORM.

Ensuite, nous l'interface resserrée, ne fournissant que la plus interface CRUD de base ne prend pas en charge SQL personnalisée. En même temps, nous utilisons C ++ caractéristiques du modèle de SQL cachés dans un assemblés appel de fonction, et l'injection anti-SQL intégré. Cela est devenu le WINQ prototype (WCDB Language Integrated Query) est.

Grâce à ces deux méthodes, nous nous en remettons à résoudre le problème ci-dessus, mais les paquets simple et brut, le manque de vernis qui ne convient pas à utiliser.

  • définition de la macro est trop complexe. Les développeurs doivent écrire champ de type double, indiquer la nécessité de définir les différents attributs et les différents types nécessitent des macros différentes, il est difficile de se rappeler. Ouvrez le code défini macro, entre les lignes, il semble ... et dit ... « Copier et coller ». . .

  • Interface trop peu. Parce que SQL est trop combinaisons en constante évolution sont nombreux, alors qu'une interface package très limitée. Cela conduit au développement des affaires timides se plaindre. Bien qu'ils ne disent pas la bouche, mais les programmeurs subtiles d'une autre manière d'exprimer leur mécontentement:

« L'homme, mon cercle d'amis ont besoin de trouver les dix plus proches messages, plus interfaces chant? »

"Mec, contacts doivent être regroupés requête, le chant des interfaces add?"

"Chant l'homme, ainsi que des interfaces?"

« Mec ... »

Eh bien, non pas l'homme, ce sont mes propres besoins, je l'ai ajouté. . .

WINQ

L'amère expérience, monter les actions open source du vent, j'ai décidé de la facilité d'utilisation pour optimiser WCDB à l'extrême. Et ce fut le WINQ, WCDB Integrated Query (WCDB Language Integrated Query).

WINQ règles de syntaxe à base SQL pour obtenir, même des instructions SQL complexes ne peuvent pas échapper à cette règle.

Pendant ce temps, Acer simplifié et plus lucide.

Pour l'utilisation de WINQ, vous pouvez vous référer aux articles précédents --- , qui met en uvre le principe je vais après la part.

Le chiffrement et l'évolution sur Android

Lorsque iOS sur l'effort de développement de l'architecture, Android, mais d'autres problèmes rencontrés.

Dans Android 2.x époque, parce que le système est imparfait, de nombreux utilisateurs de téléphones mobiles choisissent de personnaliser leur téléphone Root et une brosse. Après racine des utilisateurs et les programmes malveillants peuvent lire les données de toute APP arbitraire, afin d'examiner la sécurité des données, Android a décidé d'introduire une base de données cryptée SQLCipher.

cryptage SQLCipher

SQLCipher utiliser pleinement Crypter AES-256 la base de données, et comprend un en-tête de fichier journal / WAL, qui peut répondre aux besoins des micro-canaux.

A cette époque, la logique métier a été formé, mais le système heureusement SQLCipher fournit la même interface, nous avons terminé rapidement la migration.

Le dernier cadre Android

nous permet de migrer SQLCipher gauche l'environnement Android escalade, cadre SQLCipher Android a été réalisé en utilisant l'Android 2.x, 4.x de nombreuses nouvelles fonctionnalités micro-canal a été introduit aucun avantage, y compris la connexion mise en commun des micro-canaux multi-thread si nécessaire en même temps. Il n'y a aucun moyen de le chiffrer avec une combinaison de nouvelles fonctionnalités? A cette fin, Android a également commencé sa propre entreprise, le premier objectif est de SQLCipher et le dernier ensemble-cadre Android.

Nous combinerons SQLCipher avec le code source Android avec des modifications mineures, tout en ajoutant l'interface de cryptage, et l'accès aux dernières fonctionnalités d'Android SQLite et SQLCipher apporter la version fixe des points forts de chiffrement SQLite.

cadre Android 4.x mise en commun de connexion intégrée, la réalisation de l'iOS WCDB similaire, mais la mise en uvre de la couche Java, en utilisant un moyen de mécanisme de réveil fil de synchronisation de la réalisation de Java, comparable WCDB iOS dans le pool de connexion.

Dans le SDK Android, SQLite continuera de mettre à jour, en fait, dépend de la version de SQLite APP fonctionne sur la version du système, qui est le développeur est très désagréable, à cause des différentes instructions SQL seront les mêmes la performance. Si une entreprise a besoin d'utiliser les nouvelles fonctionnalités de SQLite, comme notre notre recherche en texte intégral, plus déterminé à faire en sorte que la nouvelle version des fonctionnalités SQLite sont disponibles sur tous les téléphones.

WCDB Depuis SQLite a construit sa propre réalisation (pour être précis SQLCipher), il est déterminé version SQLite, ce qui évite les problèmes que de nombreux développeurs.

curseur optimisé

Android cadre pour interroger la base de données en utilisant l'appelle l'interface curseur SQLiteDatabase.query (...) retourne un objet curseur, vous pouvez utiliser le curseur parcourir le jeu de résultats. Réaliser les applications SDK SQLite curseur 2Mo est affecté un tampon de taille fixe, appelée curseur de fenêtre, pour stocker le jeu de résultats de requête.

Requête, la première affectation curseur fenêtre, puis exécuter les jeux de résultats SQL se remplissent, le curseur de fenêtre terminé jusqu'à ce que rempli ou parcourir le jeu de résultats, après quoi le curseur est retourné à l'appelant. Si la ligne extérieure pour traverser tampon curseur, tout les rejets avant tampon curseur, re-requête, saut avant la ligne, une position de début de la fenêtre de curseur re-sélectionné rempli jusqu'à ce que le tampon est rempli à nouveau ou traverser complètement le jeu de résultats.

Une telle mise en uvre peut assurer un travail normal dans la plupart des cas, il n'est pas mise en uvre optimale dans de nombreux cas. Micro-canal des scénarios DB plus opérationnels est fermé après l'obtention de données de curseur traversant l'acquisition directe, les données acquises est généralement placé après la génération de l'objet physique correspondant (par ORM ou self de conversion du curseur) et la liste ou retourne à conteneurs Carte, ou pour l'affichage, ou d'une autre logique.

Dans ce scénario, les données sont d'abord stockées dans la fenêtre du curseur avant de retirer l'intermédiaire d'être soumis à deux copies de mémoire et convertir (SQLite CursorWindow Java), ce qui est tout à fait inutile. De plus, puisque le curseur de fenêtre est une longueur fixe, pour les ensembles de résultats plus petits, vous devez allouer 2 Mo de mémoire pour aucune raison, pour de grands résultats, sinon assez pour mettre bas 2MB, mais aussi conduire le chemin à parcourir la requête lourde curseur, cette consommation est assez grand .

Curseur Fenêtre, en fait, est en couche JNI Déclaration en complétant la bibliothèque SQLite, déclaration ici peut être comprise comme un poids léger, mais ne peut se déplacer vers l'avant traversal, pas de cache curseur. Ce n'est pas notre scénario compatible avec elle? Pourquoi ne pas utiliser la déclaration sous-tend? Nous avons fait un paquet simple déclaration, curseur exposé interfaces, SQLiteDirectCursor est né, et exploitons directement sous-jacente d'acquisition de données SQLite, l'opération peut être effectuée que l'itération en avant, mais il tous les besoins.

Ainsi, dans la plupart des scénarios ne ont pas besoin de passer hors du curseur, une bonne solution pour la consommation supplémentaire du curseur, en particulier dans le jeu de résultats est plus grande que les occasions 2MB.

La coopération

Au fil du temps, les chats micro-canaux de plus en plus, et bientôt enquête de chats est devenu un goulot d'étranglement, ce problème est particulièrement aigu sur la plate-forme Android. Depuis le début fragmenté, iOS et Android ne sont pas conformes à la conception de la table de données, Android sera toute l'histoire de chat enregistré sur une table de messages, ce qui provoque la table est très grande, le nombre de lignes pour atteindre un million d'ordres de grandeur, indice d'efficacité de la table est très faible, dans la conversation très lent. Et le message iOS chaque session sont stockés dans des tables différentes, et donc il y a un très grand nombre de tables, le nombre de lignes dans chaque table est pas grand-chose, en entrant dans la session plus rapidement. Bien que iOS ne pénètre pas dans le problème de la vitesse de la session, mais chaque fois que vous ouvrez l'initialisation de la base de données est très lente, ce qui en micro-canal lorsque le démarrage Caton, comment optimiser l'incapacité de démarrer.

Afin de résoudre le problème de la faible efficacité de l'indice de session, Android pense du programme iOS, après que nous explorons ensemble, Android a commencé à table points de test. feuille de pointage essai obtenu un résultat inattendu: la sous-table d'index peut vraiment résoudre le problème de la lenteur, mais Augmenter le nombre de tables se ralentirait sérieusement la vitesse d'initialisation . Jusqu'à présent, nous avons constaté que, peu importe que ce soit une sous-table ou les tables ne sont pas des solutions parfaites, afin d'assurer l'avancement du développement d'autres entreprises, les deux plates-formes ne changent pas la structure de la table, mais les uns avec les autres pour résoudre leurs propres problèmes: Index Android inefficacités et initialisation iOS Caton.

Le dernier aspect Android par la méthode de surveillance E / S de plus en plus, trouver l'index des messages de goulot d'étranglement: Utiliser la chaîne comme un indice, prenant trop de place, doivent traverser trop de nuds, ce qui provoque un grand nombre d'E / S . Solution au lieu d'utiliser la chaîne entière comme un indice, une solution spécifique avant système de partage peut faire référence --- .

iOS est pas simple, une fois que la pensée ne pouvait pas optimisé processus d'initialisation a également une percée. Après Profil RBI et ont pas de fruit, nous avons décidé SQLite accès direct au code source, une optimisation plus détaillée. Le suivi a été trouvé, le temps d'initialisation SQLite, les informations de méta sera chargé dans la table sqlite_master une table de hachage, et la capacité par défaut de la table est de 1 Ko, pour 32 octets de la table de noeud un peu plus de 32, il il remplira. Surcharge table de hachage pour dégénérer en une forme linéaire, et en comparant la chaîne de caractères est inséré dans l'élément à la position correcte. Ainsi, chaque table supplémentaire, va générer beaucoup de comparaison de chaînes d'exploitation, l'efficacité ralentissement. Ainsi, après la capacité d'adaptation des tables de hachage, Caton a résolu le problème.

Grâce à cette expérience optimisée, nous avons constaté que Android et iOS sont des problèmes communs, et d'optimiser les résultats de la recherche peuvent transmettre. Depuis lors, la coopération Android et iOS en termes de base de données est devenu proche.

étroitement

N'a pas duré longtemps, un moment où la période de pointe Fête du Printemps 2016 pour saisir une enveloppe rouge, Android et iOS reçoivent également l'alarme: chats Commentaires élévation anormale du nombre d'utilisateurs perdus.

Ceci est causé par la corruption de base de données, avant cela, nous avons dû faire face au programme: récupération de décharge, bien que le taux de réparation est pas élevé, mais il ne résout certains problèmes, il n'a pas été trop d'attention. Mais cette fois-ci, nous saisir une estimation d'enveloppe rouge est enthousiaste, ce qui entraîne le nombre de messages envoyés et reçus (patron grâce .gif) montée en flèche, souvent vers le bas le téléphone, l'espace de stockage est utilisé, ce qui est exactement l'incitation à pousser le taux d'échec élevé de la base de données.

Parce qu'il ya eu des cas de coopération réussie, cette fois-ci à entrer en cause les objectifs initiaux: les plates-formes Android et iOS pour leur R & D plus efficace des programmes respectifs, mais le début du projet à envisager d'utiliser un programme multi-plateforme, les résultats finaux peuvent être partagés. Donc, Android est responsable des aspects du développement et des solutions de sauvegarde efficaces et de récupération, les aspects iOS de la recherche d'un meilleur taux de réussite des moyens de récupération directe. Grâce à des efforts inlassables, la sauvegarde et la récupération avec le kit de réparation ont été publiés, et conformément à la norme multi-plateforme, peuvent partager les résultats. Pour plus de détails techniques sur la reprise, avant de voir les deux partagent --- et .

Jusqu'à présent, Android et iOS base de données avec des idées et de l'expérience pratique dans les composants multi-plateformes, de penser plus de considération de la direction générale du programme. Afin de mieux partager les résultats, la base de données composant Android et iOS WCDB après la reconstruction de leur logique métier dans un des composants séparés, dédiés, transposables en interne pour accéder à d'autres produits.

Finalement, WCDB devenir un des composants open source pour vous rencontrer.

Quant à l'avenir

Open source est juste le début de l'histoire, nous continuerons à faire des améliorations WCDB, y compris plus facile à utiliser l'interface, une meilleure performance et une plus grande fiabilité. Ces améliorations finiront par micro-canal interne en utilisant intacte.

scancode préoccupation WCDB, votre étoile est notre plus grande motivation!

https://github.com/Tencent/wcdb

texte recommandé aujourd'hui

Cliquez ci-dessous pour lire l'image

service de micro est pas nécessairement votre meilleure pratique, nous ne voulons pas qu'il soit trop bon

La première fois ou retour à la maison pour rencontrer les parents après la sortie de Jinfu Jiang, la plate-forme sociale pleine d'amour pour sa famille
Précédent
divorce Yang Mi après la réponse initiale suspectée: Je ne me soucie pas comment les gens regardent, j'aime fort
Prochain
2018 de haut rang drame britannique et américain (drame)
artisanat en bois pur, SENDYAUDIO a publié le nouveau casque-écran plat
« Sachant non » après le cresson de lancement 7,9 gagné des notes élevées, mais interrogeait les acteurs l'air vieux, jouer Zhao Liying?
« Persona 5 » Secret: Pirates de la cohabitation étrange et les procureurs à l'origine, douze rôle majeur Mihara
« Spider-Man: univers parallèle » vague a frappé les affiches mondiales d'art conçues par des artistes pour restaurer film
Jiang Jinfu soudain son, grâce rendu visite à un vieil ami: Je regarde de temps en temps à l'intérieur du ciel bleu
Ali la disponibilité de deux magie
le service IQue se terminera à la fin de 2016 tous
A propos de U disque / disque dur remplaçable à chaud, vous devez savoir Savait
Burst! Hong Kong Film Réalisateur Prix Ringo Lam mort, avait fait une étoile Chow Yun-Fat booster Tony
« Xiaojian pas cher » Cela semble être un joli petit Noël Zaoxin Reynolds soleil des médias sociaux hors t
« Le dernier de la plaque lourde nous » a été mis à jour pour de nouvelles fonctionnalités pour PS4 Pro