Je suis en train de créer une application qui inclut une fonctionnalité permettant de marquer en bloc des millions d'enregistrements, de manière plus ou moins interactive. L'interaction de l'utilisateur est très similaire à celle de Gmail, où les utilisateurs peuvent étiqueter des courriels individuels ou marquer de grandes quantités d'e-mails. J'ai également besoin d'un accès rapide en lecture à ces abonnements, et où le modèle de lecture est plus ou moins aléatoire.Stratégie de persistance pour les lectures et les écritures à faible latence
Actuellement, nous utilisons Mysql et insérons une ligne pour chaque paire de document-étiquette. L'écriture de millions de lignes dans Mysql prend un certain temps (E/S élevées), même avec des insertions en masse et une optimisation lourde. Nous avons besoin que ce soit un processus interactif, pas un processus par lots.
Pour les données que nous stockons et lisons, la cohérence et la disponibilité des données ne sont pas aussi importantes que les performances et l'évolutivité. Donc, en cas de défaillance du système pendant que les écritures se produisent, je peux faire face à une perte de données. Cependant, les données doivent définitivement être conservées dans le stockage secondaire à un moment donné.
Donc, pour résumer, voici les exigences:
- écrit à faible masse de latence de potentiellement des dizaines de millions d'enregistrements
- Les données doivent être persisté d'une certaine façon
- lectures aléatoires à faible latence
- durables écrit non nécessaire
- est correct cohérence dans le temps
Voici quelques solutions que j'ai regardé:
- derrière des caches écrire (terre cuite, GigaSpaces, cohérence) où les dossiers sont écrits dans la mémoire et égouttés à la base de données de manière asynchrone. Ceux-ci me font un peu peur parce qu'ils semblent ajouter une certaine quantité de complexité à l'application que je voudrais éviter.
- magasins clé-valeur hautement évolutive, comme MongoDB, HBase, Tokyo Tyrant