Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Important
Il ne s’agit pas du Kit de développement logiciel (SDK) Java pour Azure Cosmos DB le plus récent. Vous devez mettre à niveau votre projet vers le Kit de développement logiciel (SDK) Java Azure Cosmos DB v4 , puis lire le guide des conseils sur les performances du Kit de développement logiciel (SDK) Java Azure Cosmos DB v4. Suivez les instructions du guide Migrate vers le Kit de développement logiciel (SDK) Java v4 Azure Cosmos DB et le guide Reactor vs RxJava pour la mise à niveau.
Ces conseils de performances concernent uniquement le Kit de développement logiciel (SDK) Java de synchronisation Azure Cosmos DB v2. Pour plus d’informations, consultez le référentiel Maven .
Important
Le 29 février 2024, le Kit de développement logiciel (SDK) Java De synchronisation Azure Cosmos DB v2.x sera mis hors service ; le KIT SDK et toutes les applications qui utilisent le Kit de développement logiciel (SDK) continueront à fonctionner ; Azure Cosmos DB cessera simplement de fournir une maintenance et une prise en charge supplémentaires pour ce Kit de développement logiciel (SDK). Nous vous recommandons de suivre les instructions ci-dessus pour migrer vers le kit de développement logiciel (SDK) Java Azure Cosmos DB v4.
Azure Cosmos DB est une base de données distribuée rapide et flexible qui peut être mise à l’échelle en toute transparence avec une latence et un débit garantis. Vous n’avez pas à apporter de modifications d’architecture majeures ou écrire de code complexe pour mettre à l’échelle votre base de données avec Azure Cosmos DB. La réduction et l’augmentation de l’échelle est aussi simple que le passage d’un appel d’API. Pour en savoir plus, découvrez comment provisionner le débit du conteneur ou comment provisionner le débit de base de données. Toutefois, étant donné qu’Azure Cosmos DB est accessible via des appels réseau, il existe des optimisations côté client que vous pouvez effectuer pour atteindre des performances optimales lors de l’utilisation du Kit de développement logiciel (SDK) Java De synchronisation Azure Cosmos DB v2.
Par exemple, si vous vous demandez comment améliorer les performances de votre base de données, envisagez les options suivantes :
Networking
Mode de connexion : Utiliser DirectHttps
La façon dont un client se connecte à Azure Cosmos DB a des implications importantes sur les performances, en particulier en termes de latence côté client observée. Il existe un paramètre de configuration clé disponible pour la configuration du client ConnectionPolicy , le ConnectionMode. Les deux ConnectionModes disponibles sont les suivants :
-
Le mode passerelle est pris en charge sur toutes les plateformes sdk et est la valeur par défaut configurée. Si votre application s’exécute dans un réseau d’entreprise avec des restrictions de pare-feu strictes, la passerelle est le meilleur choix, car elle utilise le port HTTPS standard et un seul point de terminaison. Toutefois, le compromis des performances est que le mode passerelle implique un tronçon réseau supplémentaire chaque fois que les données sont lues ou écrites dans Azure Cosmos DB. En raison de cela, le mode DirectHttps offre de meilleures performances en raison de moins de tronçons réseau.
Le Kit de développement logiciel (SDK) Java De synchronisation Azure Cosmos DB v2 utilise HTTPS comme protocole de transport. HTTPS utilise TLS pour l’authentification initiale et le chiffrement du trafic. Lorsque vous utilisez l'ensemble de développement logiciel (SDK) Java de synchronisation de Azure Cosmos DB v2, seul le port HTTPS 443 doit être ouvert.
ConnectionMode est configuré pendant la construction de l’instance DocumentClient avec le paramètre ConnectionPolicy.
Synchroniser le Kit de développement logiciel (SDK) Java V2 (Maven com.microsoft.azure ::azure-documentdb)
public ConnectionPolicy getConnectionPolicy() { ConnectionPolicy policy = new ConnectionPolicy(); policy.setConnectionMode(ConnectionMode.DirectHttps); policy.setMaxPoolSize(1000); return policy; } ConnectionPolicy connectionPolicy = new ConnectionPolicy(); DocumentClient client = new DocumentClient(HOST, MASTER_KEY, connectionPolicy, null);
Colocaliser les clients dans la même région Azure pour de meilleures performances
Dans la mesure du possible, placez toutes les applications appelant Azure Cosmos DB dans la même région que la base de données Azure Cosmos DB. Pour une comparaison approximative, les appels à Azure Cosmos DB dans la même région s’effectuent en 1 à 2 ms, mais la latence entre les côtes Ouest et Est des États-Unis est >50 ms. Cette latence peut probablement varier d’une requête à l’autre, en fonction de l’itinéraire utilisé par la requête lorsqu’elle passe du client à la limite du centre de données Azure. Pour obtenir la latence la plus faible possible, l’application appelante doit être située dans la même région Azure que le point de terminaison Azure Cosmos DB configuré. Pour obtenir la liste des régions disponibles, voir Régions Azure.
Utilisation du Kit de développement logiciel (SDK
Installation du kit de développement logiciel (SDK) le plus récent
Les SDK Azure Cosmos DB sont constamment améliorés pour fournir des performances optimales. Pour connaître les améliorations les plus récentes du SDK, consultez le SDK Azure Cosmos DB.
Utilisez un client singleton Azure Cosmos DB tout au long de la durée de vie de votre application
Chaque instance DocumentClient est thread-safe et effectue une gestion efficace des connexions et la mise en cache des adresses lors de l’exploitation en mode direct. Pour permettre une gestion efficace des connexions et de meilleures performances par DocumentClient, il est recommandé d’utiliser une seule instance de DocumentClient par AppDomain pour la durée de vie de l’application.
Augmenter MaxPoolSize par hôte lors de l’utilisation du mode passerelle
Les requêtes Azure Cosmos DB sont effectuées via HTTPS/REST lors de l’utilisation du mode passerelle et sont soumises à la limite de connexion par défaut par nom d’hôte ou adresse IP. Vous devrez peut-être définir MaxPoolSize sur une valeur supérieure (200-1000) afin que la bibliothèque cliente puisse utiliser plusieurs connexions simultanées à Azure Cosmos DB. Dans le Kit de développement logiciel (SDK) Java De synchronisation Azure Cosmos DB v2, la valeur par défaut de ConnectionPolicy.getMaxPoolSize est 100. Utilisez setMaxPoolSize pour modifier la valeur.
Paramétrage des requêtes parallèles pour les collections partitionnés
Azure Cosmos DB Sync Java SDK version 1.9.0 et versions ultérieures prennent en charge les requêtes parallèles, ce qui vous permet d’interroger une collection partitionnée en parallèle. Pour plus d’informations, consultez les exemples de code liés à l’utilisation des kits SDK. Les requêtes parallèles sont conçues pour améliorer la latence et le débit des requêtes sur leur équivalent série.
(a) Réglage de setMaxDegreeOfParallelism : les requêtes parallèles effectuent des interrogations de plusieurs partitions simultanément. Toutefois, les données d’une collection partitionnée individuelle sont extraites en série par rapport à la requête. Utilisez donc setMaxDegreeOfParallelism pour définir le nombre de partitions qui ont le maximum de chances d’atteindre la requête la plus performante, à condition que toutes les autres conditions système restent identiques. Si vous ne connaissez pas le nombre de partitions, vous pouvez utiliser setMaxDegreeOfParallelism pour définir un nombre élevé et le système choisit le minimum (nombre de partitions, entrée fournie par l’utilisateur) comme degré maximal de parallélisme.
Il est important de noter que les requêtes parallèles produisent les meilleurs avantages si les données sont réparties uniformément sur toutes les partitions par rapport à la requête. Si la collection partitionnée est structurée de telle manière que toutes ou la plupart des données retournées par une requête sont concentrées dans quelques partitions (dans le pire des cas, une seule partition), alors la performance de la requête sera limitée par ces partitions.
(b) Paramétrage de setMaxBufferedItemCount : la requête parallèle est conçue pour prérécupérer les résultats pendant que le lot actuel de résultats est traité par le client. La prérécupération permet d’améliorer la latence globale d’une requête. setMaxBufferedItemCount limite le nombre de résultats prérécupérés. En définissant setMaxBufferedItemCount sur le nombre attendu de résultats retournés (ou un nombre supérieur), cela permet à la requête de bénéficier au maximum de la prérécupération.
La prérécupération fonctionne de la même façon, indépendamment du MaxDegreeOfParallelism, et il existe une mémoire tampon unique pour les données de toutes les partitions.
Implémenter un retrait aux intervalles spécifiés par getRetryAfterInMilliseconds
Pendant les tests de performance, vous devez augmenter la charge jusqu’à ce qu’un faible pourcentage de requêtes soit restreint. En cas de limitation, l’application cliente doit s’interrompre à la limitation pour l’intervalle de nouvelle tentative spécifié sur le serveur Respecter le délai de temporisation garantit que vous passez un temps d'attente minimal entre les nouvelles tentatives. La prise en charge de la politique de réessai est incluse à partir de la version 1.8.0 du Kit de développement logiciel Java de synchronisation Azure Cosmos DB. Pour plus d’informations, consultez getRetryAfterInMilliseconds.
Effectuer un scale-out de votre charge de travail cliente
Si vous effectuez des tests à des niveaux de débit élevés (>50 000 RU/s), l’application cliente peut devenir le goulot d’étranglement en raison du plafonnement de l’ordinateur sur l’utilisation du processeur ou du réseau. Si vous atteignez ce point, vous pouvez continuer à augmenter le compte Azure Cosmos DB en augmentant la taille des instances de vos applications clientes sur plusieurs serveurs.
Utiliser l’adressage basé sur des noms
Utilisez l’adressage basé sur le nom, où les liens ont le format
dbs/MyDatabaseId/colls/MyCollectionId/docs/MyDocumentId, au lieu de SelfLinks (_self), qui ont le formatdbs/<database_rid>/colls/<collection_rid>/docs/<document_rid>pour éviter de récupérer les ResourceIds de toutes les ressources utilisées pour construire le lien. En outre, étant donné que ces ressources sont recréées (éventuellement avec le même nom), la mise en cache peut ne pas vous aider.Ajuster la taille de la page pour les requêtes/flux de lecture pour améliorer les performances
Lors de l’exécution d’une lecture en bloc de documents à l’aide de la fonctionnalité de flux de lecture (par exemple, readDocuments) ou lors de l’émission d’une requête SQL, les résultats sont retournés de manière segmentée si le jeu de résultats est trop volumineux. Par défaut, les résultats sont retournés en blocs de 100 éléments ou 1 Mo, selon la limite atteinte en premier.
Pour réduire le nombre d’allers-retours réseau requis pour récupérer tous les résultats applicables, vous pouvez augmenter la taille de la page à l’aide de l’en-tête de demande x-ms-max-item-count jusqu’à 1 000. Dans les cas où vous devez afficher seulement quelques résultats, par exemple, si votre interface utilisateur ou l’API d’application ne retourne que 10 résultats par heure, vous pouvez également réduire la taille de la page à 10 pour réduire le débit consommé pour les lectures et les requêtes.
Vous pouvez également définir la taille de page à l’aide de la méthode setPageSize.
Stratégie d’indexation
Exclusion des chemins d’accès inutilisés de l’indexation pour des écritures plus rapides
La stratégie d’indexation d’Azure Cosmos DB vous permet de spécifier les chemins d’accès de document à inclure ou exclure de l’indexation à l’aide de chemins d’indexation (setIncludedPaths et setExcludedPaths). L’utilisation des chemins d’accès d’indexation peut offrir des performances d’écriture améliorées et réduire le stockage d’index pour les scénarios dans lesquels les modèles de requête sont connus d’avance, puisque les coûts d’indexation sont directement liés au nombre de chemins d’accès uniques indexés. Par exemple, le code suivant montre comment exclure une section entière (sous-arborescence) des documents de l’indexation à l’aide du caractère générique « * ».
Synchroniser le Kit de développement logiciel (SDK) Java V2 (Maven com.microsoft.azure ::azure-documentdb)
Index numberIndex = Index.Range(DataType.Number); numberIndex.set("precision", -1); indexes.add(numberIndex); includedPath.setIndexes(indexes); includedPaths.add(includedPath); indexingPolicy.setIncludedPaths(includedPaths); collectionDefinition.setIndexingPolicy(indexingPolicy);Pour plus d’informations, consultez Stratégies d’indexation d’Azure Cosmos DB.
Débit
Mesure et réglage pour réduire l’utilisation d’unités de requête par seconde
Azure Cosmos DB propose un riche ensemble d’opérations de base de données, y compris les requêtes hiérarchiques et relationnelles avec les fonctions définies par l’utilisateur, les procédures stockées et les déclencheurs, qui fonctionnent toutes au niveau des documents d’une collection de base de données. Le coût associé à chacune de ces opérations varie en fonction du processeur, des E/S et de la mémoire nécessaires à l’exécution de l’opération. Plutôt que de vous soucier de la gestion des ressources matérielles, vous pouvez considérer une unité de demande comme une mesure unique des ressources nécessaires à l’exécution des opérations de base de données et à la réponse à la requête de l’application.
Le débit est provisionné en fonction du nombre d’unités de requête défini pour chaque conteneur. La consommation d’unités de requête est évaluée en fonction d’un taux par seconde. Les applications qui dépassent le taux d’unités de requête configuré pour le conteneur associé sont limitées jusqu’à ce que le taux soit inférieur au niveau configuré pour le conteneur. Si votre application requiert un niveau de débit plus élevé, vous pouvez augmenter le débit en provisionnant des unités de requête supplémentaires.
La complexité d’une requête a un impact sur le nombre d’unités de requête consommées pour une opération. Le nombre de prédicats, la nature des prédicats, le nombre de fonctions définies par l’utilisateur et la taille du jeu de données sources ont tous une influence sur le coût des opérations de requête.
Pour mesurer la surcharge de toute opération (créer, mettre à jour ou supprimer), inspectez l’en-tête x-ms-request-charge (ou la propriété RequestCharge équivalente dans ResourceResponse<T> ou FeedResponse<T> pour mesurer le nombre d’unités de requête consommées par ces opérations.
Synchroniser le Kit de développement logiciel (SDK) Java V2 (Maven com.microsoft.azure ::azure-documentdb)
ResourceResponse<Document> response = client.createDocument(collectionLink, documentDefinition, null, false); response.getRequestCharge();Les frais de la requête retournée dans cet en-tête correspondent à une fraction du débit provisionné. Par exemple, si vous avez provisionné 2000 RU/s et si la requête précédente retourne 1 000 documents de 1 Ko, le coût de l’opération est de 1 000. Par conséquent, en une seconde, le serveur honore uniquement deux requêtes avant de limiter le taux de requêtes suivantes. Pour plus d’informations, consultez Unités de requête et la calculatrice d’unités de requête.
Gestion de la limitation du taux/du taux de requêtes trop élevé
Lorsqu’un client tente de dépasser le débit réservé pour un compte, les performances au niveau du serveur ne sont pas affectées et la capacité de débit n’est pas utilisée au-delà du niveau réservé. Le serveur met fin à la requête de manière préventive avec RequestRateTooLarge (code d’état HTTP 429) et il retourne l’en-tête x-ms-retry-after-ms indiquant la durée, en millisecondes, pendant laquelle l’utilisateur doit attendre avant de réessayer.
HTTP Status 429, Status Line: RequestRateTooLarge x-ms-retry-after-ms :100Les kits de développement logiciel (SDK) interceptent tous implicitement cette réponse, respectent l’en-tête retry-after spécifiée par le serveur, puis relancent la requête. La tentative suivante réussira toujours, sauf si plusieurs clients accèdent simultanément à votre compte.
Si plusieurs clients fonctionnent de façon cumulative au-dessus du taux de requête, le nombre de nouvelles tentatives par défaut défini sur 9 en interne par le client peut ne pas suffire ; dans ce cas, le client lève une exception DocumentClientException avec le code d’état 429 à l’application. Le nombre de nouvelles tentatives par défaut peut être modifié à l’aide de setRetryOptions sur l’instance ConnectionPolicy . Par défaut, DocumentClientException avec le code d’état 429 est retourné après un délai d’attente cumulé de 30 secondes si la requête continue à fonctionner au-dessus du taux de requête. Cela se produit même lorsque le nombre de nouvelles tentatives actuel est inférieur au nombre maximal de nouvelles tentatives, qu’il s’agisse de la valeur par défaut de 9 ou d’une valeur définie par l’utilisateur.
Alors que le comportement de nouvelle tentative automatique permet d’améliorer la résilience et la facilité d’utilisation pour la plupart des applications, il peut se révéler contradictoire lors de l’exécution de tests de performances, en particulier lors de la mesure de la latence. La latence client observée atteindra un pic si l’expérience atteint la limite de serveur et oblige le kit de développement logiciel (SDK) client à effectuer une nouvelle tentative en silence. Pour éviter des pics de latence lors des expériences de performances, mesurez la charge renvoyée par chaque opération et assurez-vous que les requêtes fonctionnent en dessous du taux de requête réservé. Pour plus d’informations, consultez Unités de requête.
Conception de documents plus petits pour un débit plus élevé
Les frais de requête (le coût de traitement de requête) d’une opération donnée sont directement liés à la taille du document. Des opérations sur des documents volumineux coûtent plus cher que des opérations sur de petits documents.
Étapes suivantes
Pour en savoir plus sur la conception de votre application pour une mise à l’échelle et des hautes performances, consultez Partitionnement et mise à l’échelle dans Azure Cosmos DB.