Le tout à la fin des vacances! ... Certains diront que cette félicitation est bof. Mais, sûrement, beaucoup auront bientôt des vacances, alors prenez un peu plus. Eh bien, nous ne perdons pas de notre élan et en cette chaude journée, nous partageons l'expérience de nos partenaires. Il s'agira d'optimiser le travail avec la base de données. Plus de détails sous la coupe!
Je donne la parole à l'auteur.Nous vous souhaitons la bienvenue, lecteurs de Habr! Nous sommes l'équipe
WaveAccess , dans cet article, nous partagerons avec vous l'expérience de l'utilisation du service de base de données Azure Cosmos DB (DB) dans un projet commercial. Nous vous expliquerons pourquoi la base de données est destinée et les nuances auxquelles nous avons dû faire face pendant le développement.
Qu'est-ce qu'Azure Cosmos DB
Azure Cosmos DB est un service de base de données commercial, distribué dans le monde entier avec un paradigme multimodèle, fourni en tant que solution PaaS. Elle est la prochaine génération d'Azure DocumentDB.
La base de données a été développée en 2017 par Microsoft avec la participation de Leslie Lamport, Ph.D. en informatique (lauréate du prix Turing 2013 pour une contribution fondamentale à la théorie des systèmes distribués, développeur LaTex, créateur de la spécification TLA +).
Les principales caractéristiques d'Azure Cosmos DB sont:
- Base de données non relationnelle;
- Les documents qu'il contient sont stockés sous JSON;
- Mise à l'échelle horizontale avec un choix de régions géographiques;

- Paradigme de données multimodèle: valeur-clé, document, graphique, famille de colonnes;
- Latence faible pour 99% des requêtes: moins de 10 ms pour les opérations de lecture et moins de 15 ms pour les opérations d'écriture (indexées);
- Conçu pour un débit élevé;
- Il garantit la disponibilité, la cohérence des données, la latence au niveau SLA de 99,999%;
- Bande passante configurable
- Réplication automatique (maître-esclave);
- Indexation automatique des données;
- Niveaux de cohérence des données personnalisables. 5 niveaux différents (Strong, Bound Staleness, Session, Consistent Prefix, Eventual);
Sur le graphique, vous pouvez voir la dépendance de différents niveaux de cohérence sur la disponibilité, les performances et la cohérence des données.

- Pour une transition pratique vers Cosmos DB à partir de sa base de données, il existe de nombreuses API pour accéder aux données: SQL, JavaScript, Gremlin, MongoDB, Cassandra, Azure Blob;
- Pare-feu personnalisable;
- Taille de base de données personnalisée.
La tâche que nous avons résolue
Des milliers de capteurs situés dans le monde transmettent des informations (ci-après des notifications) toutes les quelques N secondes. Ces notifications doivent être stockées dans la base de données, puis les rechercher et les afficher dans l'interface utilisateur de l'opérateur du système.
Exigences du client:
- Utilisation d'une pile de technologies Microsoft, y compris le cloud Azure;
- Débit de 100 requêtes par seconde;
- Les notifications n'ont pas de structure claire et pourraient s'étendre davantage;
- Pour les notifications critiques, la vitesse de traitement est importante;
- Haute résilience du système.
Sur la base des besoins des clients, nous avons été idéalement approchés par une base de données commerciale fiable, non relationnelle, distribuée mondialement.

Si nous regardons des bases de données similaires à Cosmos DB, nous pouvons rappeler Amazon DynamoDB, Google Cloud Spanner. Mais Amazon DynamoDB n'est pas distribué à l'échelle mondiale et Google Cloud Spanner a moins de niveaux de cohérence et de types de modèles de données (uniquement tabulaires, relationnels).
Pour ces raisons, nous nous sommes installés sur Azure Cosmos DB. Pour interagir avec la base de données, nous avons
utilisé le SDK Azure Cosmos DB pour .NET , car le backend a été écrit en .NET.
Les nuances que nous avons rencontrées
1. Gestion de la base de donnéesPour commencer à utiliser la base de données, vous devez tout d'abord choisir un outil pour la gérer. Nous avons utilisé Azure Cosmos DB Data Explorer dans le portail Azure et
DocumentDbExplorer . Il existe également un utilitaire Azure Storage Explorer.
2. Configuration des collections de bases de donnéesDans Cosmos DB, chaque base de données se compose de collections et de documents.
Fonctionnalités de collection personnalisables à surveiller:
- Taille de la collection: fixe ou illimitée;
- Bande passante en unités de requêtes par seconde RU / s (à partir de 400 RU / s);

- Politique d'indexation (incluant ou excluant les documents et les chemins vers et depuis l'index, configuration de divers types d'index, configuration des modes de mise à jour de l'index).
Exemple d'index type
{ "id": "datas", "indexingPolicy": { "indexingMode": "consistent", "automatic": true, "includedPaths": [ { "path": "/*", "indexes": [ { "kind": "Range", "dataType": "Number", "precision": -1 }, { "kind": "Hash", "dataType": "String" }, { "kind": "Spatial", "dataType": "Point" } ] } ], "excludedPaths": [] } }
Pour que la recherche de sous-chaîne fonctionne, pour les champs de chaîne, vous devez utiliser l'index Hash («kind»: «Hash»).
3. Transactions de base de donnéesLes transactions sont implémentées dans la base de données au niveau des procédures stockées (l'exécution d'une procédure stockée est une opération atomique). Procédures stockées JavaScript
var helloWorldStoredProc = { id: "helloWorld", body: function () { var context = getContext(); var response = context.getResponse(); response.setBody("Hello, World"); } }
4. Canal de changement de base de donnéesChange Feed écoute les modifications de la collection. Lorsque des modifications sont apportées aux documents de collection, la base de données déclenche un événement sur les modifications apportées à tous les abonnés de ce canal.
Nous avons utilisé Change Feed pour suivre les modifications de la collection. Lors de la création d'un canal, vous devez d'abord créer une collection
AUX auxiliaire qui coordonne le traitement du canal de changement pour plusieurs rôles professionnels.
5. Restrictions de la base de données:- Manque d'opérations en bloc (procédures stockées utilisées pour la suppression en masse , mise à jour des documents);
- Absence de mise à jour partielle du document;
- Aucune opération SKIP (complexité de la mise en œuvre de la pagination). Pour implémenter la pagination dans les demandes de notifications, nous avons utilisé les paramètres RequestContinuation (lien vers le dernier élément suite à l'émission) et MaxItemCount (le nombre d'éléments renvoyés par la base de données). Par défaut, les résultats sont renvoyés par lots (pas plus de 100 éléments et pas plus de 1 Mo dans chaque package). Le nombre d'articles retournés peut être augmenté à 1000 à l'aide du paramètre MaxItemCount.
6. Traitement de la 429e erreur de base de donnéesLorsque la bande passante de collecte atteint son maximum, la base de données commence à générer une erreur «429 Too Many Request». Pour la traiter, vous pouvez utiliser le paramètre
RetryOptions dans le SDK, où MaxRetryAttemptsOnThrottledRequests est le nombre de tentatives pour terminer la demande et MaxRetryWaitTimeInSeconds est la durée totale des tentatives de connexion.
7. Prévision du coût d'utilisation de la base de donnéesPour prévoir le coût d'utilisation de la base de données, nous avons utilisé le
calculateur en ligne RU / s. Dans le plan de base, une unité de requête pour un élément de 1 Ko correspond à une simple commande GET par un lien vers lui-même ou l'identifiant de cet élément.
Conclusions
Azure Cosmos DB est facile à utiliser, facile et flexible à configurer via le portail Azure. Les nombreuses API d'accès aux données facilitent la migration vers Cosmos DB. Pas besoin d'engager un administrateur de base de données pour maintenir la base de données. Les garanties financières SLA, la mise à l'échelle horizontale globale rendent cette base de données très attractive sur le marché. Il est adapté à une utilisation dans des applications d'entreprise et mondiales qui imposent des exigences élevées en matière de tolérance aux pannes et de bande passante. Chez WaveAccess, nous continuons à utiliser Cosmos DB dans nos projets.
À propos de l'auteur
L'équipe
WaveAccess crée des
logiciels techniquement sophistiqués, hautement chargés et tolérants aux pannes pour les entreprises du monde entier.
Alexander Azarov , vice-président senior du développement logiciel chez WaveAccess, commente:
À première vue, les tâches difficiles peuvent être résolues par des méthodes relativement simples. Il est important non seulement d'apprendre de nouveaux outils, mais aussi de perfectionner la connaissance des technologies familières.
Blog d'entreprise