Liste de contrôle des performances et de l’extensibilité de Microsoft Azure StorageMicrosoft Azure Storage Performance and Scalability Checklist

PrésentationOverview

Depuis la publication des services Microsoft Azure Storage, Microsoft a élaboré une série de pratiques éprouvées pour les utiliser de manière performante. Cet article se propose d’énumérer les méthodes les plus importantes sous la forme d’une liste de contrôle.Since the release of the Microsoft Azure Storage services, Microsoft has developed a number of proven practices for using these services in a performant manner, and this article serves to consolidate the most important of them into a checklist-style list. L’objectif de cet article est double : aider les développeurs d’applications à s’assurer qu’ils utilisent des pratiques éprouvées avec Azure Storage et les aider à en identifier d’autres en vue de les adopter.The intention of this article is to help application developers verify they are using proven practices with Azure Storage and to help them identify other proven practices they should consider adopting. Cet article n’a pas pour but d’aborder toutes les questions relatives à l’optimisation de l’extensibilité et des performances. Sont exclues les pratiques dont l’impact est minime ou celles qui ne sont pas applicables à grande échelle.This article does not attempt to cover every possible performance and scalability optimization — it excludes those that are small in their impact or not broadly applicable. Dans la mesure où le comportement de l’application peut être prévu au cours de la conception, il convient de tenir compte de ces pratiques suffisamment tôt afin d’éviter les problèmes de performances ultérieurs.To the extent that the application's behavior can be predicted during design, it's useful to keep these in mind early on to avoid designs that will run into performance problems.

Chaque développeur d’applications à l’aide d’Azure Storage doit prendre le temps de lire cet article et vérifiez que son application respecte chacune des pratiques éprouvées répertoriées ci-dessous.Every application developer using Azure Storage should take the time to read this article, and check that their application follows each of the proven practices listed below.

Liste de contrôleChecklist

Dans cet article, les pratiques éprouvées sont classées dans les groupes suivants.This article organizes the proven practices into the following groups. Pratiques éprouvées applicables aux éléments suivants :Proven practices applicable to:

  • Tous les services Azure Storage (objets blob, tables, files d’attente et fichiers)All Azure Storage services (blobs, tables, queues, and files)
  • Objets blobBlobs
  • TablesTables
  • Files d’attenteQueues
TerminéDone DomaineArea CatégorieCategory QuestionQuestion
  Tous les servicesAll Services Objectifs d'évolutivitéScalability Targets Votre application est-elle conçue de manière à éviter d'atteindre les objectifs d'évolutivité ?Is your application designed to avoid approaching the scalability targets?
  Tous les servicesAll Services Objectifs d'évolutivitéScalability Targets Votre convention d'affectation de noms est-elle conçue pour améliorer l'équilibrage de la charge ?Is your naming convention designed to enable better load-balancing?
  Tous les servicesAll Services Mise en réseauNetworking Les appareils côté client disposent-ils d'une bande passante suffisamment large et d'une latence suffisamment faible pour parvenir aux performances requises ?Do client side devices have sufficiently high bandwidth and low latency to achieve the performance needed?
  Tous les servicesAll Services Mise en réseauNetworking La qualité de la liaison des appareils côté client est-elle suffisamment élevée ?Do client side devices have a high enough quality link?
  Tous les servicesAll Services Mise en réseauNetworking L'application cliente est-elle située « à proximité » du compte de stockage ?Is the client application located "near" the storage account?
  Tous les servicesAll Services Distribution de contenuContent Distribution Utilisez-vous un CDN pour la distribution de contenu ?Are you using a CDN for content distribution?
  Tous les servicesAll Services Accès direct au clientDirect Client Access Utilisez-vous SAP et CORS au lieu d'un proxy pour permettre un accès direct au client ?Are you using SAS and CORS to allow direct access to storage instead of proxy?
  Tous les servicesAll Services Mise en cacheCaching Votre application met-elle en cache les données qui sont utilisées fréquemment et qui changent rarement ?Is your application caching data that is repeatedly used and changes rarely?
  Tous les servicesAll Services Mise en cacheCaching Votre application traite-t-elle les mises à jour par lots (mise en cache côté client, suivie du téléchargement dans des ensembles plus grands) ?Is your application batching updates (caching them client side and then uploading in larger sets)?
  Tous les servicesAll Services Configuration .NET.NET Configuration Avez-vous configuré votre client pour qu'il utilise un nombre suffisant de connexions simultanées ?Have you configured your client to use a sufficient number of concurrent connections?
  Tous les servicesAll Services Configuration .NET.NET Configuration Avez-vous configuré .NET pour qu'il utilise un nombre suffisant de threads ?Have you configured .NET to use a sufficient number of threads?
  Tous les servicesAll Services Configuration .NET.NET Configuration Utilisez-vous .NET 4.5 ou version ultérieure, qui présente une méthode de nettoyage de mémoire optimisée ?Are you using .NET 4.5 or later, which has improved garbage collection?
  Tous les servicesAll Services ParallélismeParallelism Vous êtes-vous assuré que le parallélisme était limité de manière appropriée, de manière à ne pas surcharger les capacités du client, ni dépasser les objectifs d'évolutivité ?Have you ensured that parallelism is bounded appropriately so that you don't overload either your client capabilities or the scalability targets?
  Tous les servicesAll Services OutilsTools Utilisez-vous la version la plus récente des outils et bibliothèques clientes fournis par Microsoft ?Are you using the latest version of Microsoft provided client libraries and tools?
  Tous les servicesAll Services TentativesRetries Utilisez-vous une stratégie de nouvelles tentatives d'interruption exponentielle pour les erreurs de limitation et les délais d'expiration ?Are you using an exponential backoff retry policy for throttling errors and timeouts?
  Tous les servicesAll Services Nouvelle tentativesRetries Votre application empêche-t-elle les nouvelles tentatives pour les erreurs non renouvelables ?Is your application avoiding retries for non-retryable errors?
  Objets blobBlobs Objectifs d'évolutivitéScalability Targets Disposez-vous d’un grand nombre de clients qui accèdent simultanément à un seul objet ?Do you have a large number of clients accessing a single object concurrently?
  Objets blobBlobs Objectifs d'évolutivitéScalability Targets Votre application respecte-t-elle l'objectif d'évolutivité relatif aux opérations ou à la bande passante pour un objet blob unique ?Is your application staying within the bandwidth or operations scalability target for a single blob?
  Objets blobBlobs Copie d'objets blobCopying Blobs La copie des objets blob s'effectue-t-elle de manière efficace ?Are you copying blobs in an efficient manner?
  Objets blobBlobs Copie d'objets blobCopying Blobs Utilisez-vous AzCopy pour les copies en bloc d'objets blob ?Are you using AzCopy for bulk copies of blobs?
  Objets blobBlobs Copie d'objets blobCopying Blobs Utilisez-vous le service Azure Import/Export pour transférer de gros volumes de données ?Are you using Azure Import/Export to transfer large volumes of data?
  Objets blobBlobs Utilisation de métadonnéesUse Metadata Stockez-vous des métadonnées fréquemment utilisées concernant des objets blob dans leurs métadonnées ?Are you storing frequently used metadata about blobs in their metadata?
  Objets blobBlobs Téléchargement rapideUploading Fast Lorsque vous essayez de télécharger rapidement un seul objet blob, téléchargez-vous les blocs en parallèle ?When trying to upload one blob quickly, are you uploading blocks in parallel?
  Objets blobBlobs Téléchargement rapideUploading Fast Lorsque vous essayez de télécharger rapidement de nombreux objets blob, les téléchargez-vous en parallèle ?When trying to upload many blobs quickly, are you uploading blobs in parallel?
  Objets blobBlobs Type d'objet blob correctCorrect Blob Type Utilisez-vous des objets blob de pages ou de blocs lorsque cela s'avère approprié ?Are you using page blobs or block blobs when appropriate?
  TablesTables Objectifs d'évolutivitéScalability Targets Vous approchez-vous des objectifs d'évolutivité en termes d'entités par seconde ?Are you approaching the scalability targets for entities per second?
  TablesTables ConfigurationConfiguration Utilisez-vous JSON pour vos demandes de table ?Are you using JSON for your table requests?
  TablesTables ConfigurationConfiguration Avez-vous désactivé Nagle pour améliorer les performances des petites demandes ?Have you turned Nagle off to improve the performance of small requests?
  TablesTables Tables et partitionsTables and Partitions Avez-vous correctement partitionné vos données ?Have you properly partitioned your data?
  TablesTables Partitions activesHot Partitions Évitez-vous les modèles « Ajouter après uniquement » ou « Ajouter avant uniquement » ?Are you avoiding append-only and prepend-only patterns?
  TablesTables Partitions activesHot Partitions Vos opérations d'insertion/de mise à jour couvrent-elles plusieurs partitions ?Are your inserts/updates spread across many partitions?
  TablesTables Étendue de requêteQuery Scope Avez-vous conçu votre schéma pour qu'il autorise l'utilisation des requêtes de point dans la plupart des cas et l'utilisation modérée des requêtes de tables ?Have you designed your schema to allow for point queries to be used in most cases, and table queries to be used sparingly?
  TablesTables Densité des requêtesQuery Density En règle générale, vos requêtes n'analysent et ne renvoient-elles que les lignes qui seront utilisées par votre application ?Do your queries typically only scan and return rows that your application will use?
  TablesTables Limitation des données renvoyéesLimiting Returned Data Utilisez-vous le filtrage pour éviter le renvoi d'entités inutiles ?Are you using filtering to avoid returning entities that are not needed?
  TablesTables Limitation des données renvoyéesLimiting Returned Data Utilisez-vous la projection pour éviter le renvoi de propriétés inutiles ?Are you using projection to avoid returning properties that are not needed?
  TablesTables DénormalisationDenormalization Avez-vous dénormalisé vos données de manière à éviter les requêtes inefficaces ou les demandes de lecture multiples lorsque vous essayez de récupérer des données ?Have you denormalized your data such that you avoid inefficient queries or multiple read requests when trying to get data?
  TablesTables Insertion/Mise à jour/SuppressionInsert/Update/Delete Effectuez-vous un traitement par lots des demandes qui doivent être transactionnelles ou qui peuvent être effectuées en même temps pour réduire les allers-retours ?Are you batching requests that need to be transactional or can be done at the same time to reduce round-trips?
  TablesTables Insertion/Mise à jour/SuppressionInsert/Update/Delete Évitez-vous de récupérer une entité pour déterminer simplement s'il faut appeler l'opération insert ou update ?Are you avoiding retrieving an entity just to determine whether to call insert or update?
  TablesTables Insertion/Mise à jour/SuppressionInsert/Update/Delete Avez-vous envisagé de stocker des séries de données qui seront fréquemment récupérées ensemble dans une seule entité sous la forme de propriétés plutôt que d'entités multiples ?Have you considered storing series of data that will frequently be retrieved together in a single entity as properties instead of multiple entities?
  TablesTables Insertion/Mise à jour/SuppressionInsert/Update/Delete Dans le cas des tables qui sont toujours récupérées ensemble et qui peuvent être écrites par lots (des données de séries temporelles, par exemple), avez-vous envisagé d’utiliser des objets blob à la place de tables ?For entities that will always be retrieved together and can be written in batches (for example, time series data), have you considered using blobs instead of tables?
  Files d'attenteQueues Objectifs d'évolutivitéScalability Targets Vous approchez-vous des objectifs d'évolutivité en termes de messages par seconde ?Are you approaching the scalability targets for messages per second?
  Files d'attenteQueues ConfigurationConfiguration Avez-vous désactivé Nagle pour améliorer les performances des petites demandes ?Have you turned Nagle off to improve the performance of small requests?
  Files d'attenteQueues Taille des messagesMessage Size Vos messages sont-ils compacts pour améliorer les performances de la file d'attente ?Are your messages compact to improve the performance of the queue?
  Files d'attenteQueues Récupération en blocBulk Retrieve Récupérez-vous plusieurs messages dans une seule opération « Get » ?Are you retrieving multiple messages in a single "Get" operation?
  Files d'attenteQueues Fréquence d'interrogationPolling Frequency Effectuez-vous des interrogations suffisamment fréquentes pour réduire la latence perçue de votre application ?Are you polling frequently enough to reduce the perceived latency of your application?
  Files d'attenteQueues Mise à jour de messageUpdate Message Utilisez-vous la méthode UpdateMessage pour stocker la progression du traitement des messages et éviter de devoir retraiter l'intégralité du message en cas d'erreur ?Are you using UpdateMessage to store progress in processing messages, avoiding having to reprocess the entire message if an error occurs?
  Files d'attenteQueues ArchitectureArchitecture Utilisez-vous des files d'attente pour rendre toute votre application plus extensible en excluant les charges de travail de longue durée du chemin critique et pour les faire ensuite évoluer séparément ?Are you using queues to make your entire application more scalable by keeping long-running workloads out of the critical path and scale then independently?

Tous les ServicesAll Services

Cette section répertorie les pratiques éprouvées qui s’appliquent à l’utilisation de tout service Azure Storage (objets blob, tables, files d’attente ou fichiers).This section lists proven practices that are applicable to the use of any of the Azure Storage services (blobs, tables, queues, or files).

Objectifs d’extensibilitéScalability Targets

Stockage Azure lui-même a une limite de 250 comptes de stockage par région et par abonnement.Azure Storage itself has a limit of 250 storage accounts per region per subscription. Si vous atteignez cette limite, vous ne pourrez pas créer d’autres comptes de stockage dans cette combinaison abonnement/région.If you reach that limit, you will be unable to create any more storage accounts in that subscription/region combination.

Chaque service Azure Storage présente des objectifs d’extensibilité en termes de capacité (Go), de taux de transactions et de bande passante.Each of the Azure Storage services has scalability targets for capacity (GB), transaction rate, and bandwidth. Si votre application s’approche de l’un des objectifs d’extensibilité, voire le dépasse, une limitation ou des latences de transaction accrues peuvent survenir.If your application approaches or exceeds any of the scalability targets, it may encounter increased transaction latencies or throttling. Lorsqu’un service de stockage limite votre application, il commence à renvoyer les codes d’erreur « 503 Serveur occupé » ou « 500 Délai d’expiration de l’opération » pour certaines opérations de stockage.When a Storage service throttles your application, the service begins to return "503 Server busy" or "500 Operation timeout" error codes for some storage transactions. Cette section traite de la méthode générale de traitement des objectifs d’extensibilité et, en particulier, des objectifs d’extensibilité de bande passante.This section discusses both the general approach to dealing with scalability targets and bandwidth scalability targets in particular. Les sections ultérieures portant sur les différents services de stockage traitent des objectifs d’extensibilité dans le cadre de ce service spécifique :Later sections that deal with individual storage services discuss scalability targets in the context of that specific service:

Cible d’extensibilité de bande passante pour tous les servicesBandwidth Scalability Target for All Services

Au moment de la rédaction du présent document, les objectifs de bande passante, aux États-Unis, d’un compte de stockage géo-redondant (GRS) étaient de 10 Gbits/s (gigabits par seconde) en entrée (données envoyées vers le compte de stockage) et de 20 Gbits/s en sortie (données envoyées à partir du compte de stockage).At the time of writing, the bandwidth targets in the US for a geo-redundant storage (GRS) account are 10 gigabits per second (Gbps) for ingress (data sent to the storage account) and 20 Gbps for egress (data sent from the storage account). Ces limites sont plus élevées dans le cas d’un compte de stockage redondant local (LRS), à savoir : 20 Gbits/s en entrée et 30 Gbits/s en sortie.For a locally redundant storage (LRS) account, the limits are higher – 20 Gbps for ingress and 30 Gbps for egress. Les limites de bande passante internationales peuvent être inférieures. Pour les consulter, rendez-vous sur la page traitant des objectifs d’extensibilité.International bandwidth limits may be lower and can be found on our scalability targets page. Pour plus d’informations sur les options de redondance du stockage, consultez les liens de la section Ressources utiles ci-dessous.For more information on the storage redundancy options, see the links in Useful Resources below.

Que faire lorsque l’on s’approche d’un objectif d’extensibilité ?What to do when approaching a scalability target

Si vous êtes proche de la limite du nombre de comptes de stockage que peut contenir une combinaison abonnement/région particulière, évaluez votre application et l’utilisation des comptes de stockage, et déterminez si l’une de ces conditions s’applique.If you're approaching the limit of storage accounts you can have in a particular subscription/region combination, evaluate your application and usage of storage accounts and determine if any of these conditions apply.

  • Utilisation de comptes de stockage en tant que disques non managés et ajout de ces disques à vos machines virtuelles.Using storage accounts as unmanaged disks and adding those disks to your virtual machines. Dans ce scénario, nous vous recommandons d’utiliser des disques managés, car ceux-ci gèrent la scalabilité des disques de stockage pour vous sans que vous ayez à créer ou à gérer des comptes de stockage.In this scenario, we recommend using managed disks, as they handle storage disk scalability for you without you having to create and manage individual storage accounts.
  • Utilisation d’un compte de stockage par client, à des fins d’isolation des données.Using one storage account on a per customer basis, for the purpose of data isolation. Dans ce scénario, nous vous recommandons d’utiliser des conteneurs de stockage pour chaque client plutôt qu’un compte de stockage entier.In this scenario, we recommend using storage containers for each customer rather than an entire storage account. Stockage Azure vous permet désormais de spécifier le contrôle d’accès en fonction du rôle sur la base de chaque conteneur.Azure Storage now allows you to specify role-based access control on a per container basis.
  • Utilisation de plusieurs comptes de stockage afin de bénéficier d’une meilleure scalabilité d’entrée/sortie/iops/capacité.Using multiple storage accounts to shard for greater scalability of ingress/egress/iops/capacity. Dans ce scénario, si possible, nous vous recommandons de tirer parti de l’augmentation des limites du nombre de comptes de stockage standard, afin de réduire le nombre de comptes de stockage nécessaires pour votre charge de travail.In this scenario, if possible, we recommend you take advantage of the increased limits of standard storage accounts to reduce the number of storage accounts required for your workload.

Si votre application s’approche des objectifs d’extensibilité d’un seul compte de stockage, pensez à appliquer l’une des méthodes suivantes :If your application is approaching the scalability targets for a single storage account, consider adopting one of the following approaches:

  • Réexaminez la charge de travail à cause de laquelle votre application s’approche de l’objectif d’extensibilité ou le dépasse.Reconsider the workload that causes your application to approach or exceed the scalability target. Est-il possible de la concevoir différemment pour qu’elle utilise moins de bande passante ou de capacité, ou moins de transactions ?Can you design it differently to use less bandwidth or capacity, or fewer transactions?
  • Si une application doit dépasser l’un des objectifs d’extensibilité, vous devez créer plusieurs comptes de stockage et partitionner vos données d’application sur ces comptes.If an application must exceed one of the scalability targets, you should create multiple storage accounts and partition your application data across those multiple storage accounts. Si vous optez pour ce modèle, veillez à concevoir votre application de telle sorte que vous puissiez ajouter davantage de comptes de stockage à l’avenir en vue de l’équilibrage de la charge.If you use this pattern, then be sure to design your application so that you can add more storage accounts in the future for load balancing. Au moment de la rédaction du présent document, chaque abonnement Azure peut comporter jusqu’à 100 comptes de stockage.At time of writing, each Azure subscription can have up to 100 storage accounts. De plus, aucun coût autre que l’utilisation en termes de données stockées, de transactions effectuées ou de données transférées n’est associé à ces comptes de stockage.Storage accounts also have no cost other than your usage in terms of data stored, transactions made, or data transferred.
  • Si votre application atteint les objectifs de bande passante, pensez à compresser les données dans le client afin de réduire la bande passante nécessaire pour envoyer les données au service de stockage.If your application hits the bandwidth targets, consider compressing data in the client to reduce the bandwidth required to send the data to the storage service. Bien que cela puisse réduire la bande passante et améliorer les performances du réseau, cette méthode présente des aspects négatifs.While this may save bandwidth and improve network performance, it can also have some negative impacts. Vous devez évaluer l’impact sur les performances en raison des exigences de traitement supplémentaires liées à la compression et à la décompression des données sur le client.You should evaluate the performance impact of this due to the additional processing requirements for compressing and decompressing data in the client. Le stockage de données compressées peut, en outre, rendre plus complexe la résolution des problèmes, étant donné qu’il peut s’avérer plus difficile d’afficher les données stockées à l’aide d’outils standard.In addition, storing compressed data can make it more difficult to troubleshoot issues since it could be more difficult to view stored data using standard tools.
  • Si votre application atteint les objectifs d’extensibilité, vérifiez que vous utilisez bien une interruption exponentielle pour les nouvelles tentatives (voir Nouvelles tentatives).If your application hits the scalability targets, then ensure that you are using an exponential backoff for retries (see Retries). Il est préférable de veiller à ne jamais s’approcher des objectifs d’extensibilité (en utilisant l’une des méthodes ci-dessus). Vous vous assurez ainsi que votre application n’effectue pas de nouvelle tentative immédiatement, ce qui aurait pour conséquence d’empirer la limitation.It's better to make sure you never approach the scalability targets (by using one of the above methods), but this will ensure your application won't just keep retrying rapidly, making the throttling worse.

Ressources utilesUseful Resources

Suivez les liens ci-dessous pour obtenir des informations détaillées sur les objectifs d'évolutivité :The following links provide additional detail on scalability targets:

Conventions d’affectation de noms aux partitionsPartition Naming Convention

Azure Storage utilise un schéma de partitionnement basé sur une plage pour mettre à l'échelle et équilibrer la charge du système.Azure Storage uses a range-based partitioning scheme to scale and load balance the system. La clé de partition sert à partitionner les données en plages, et la charge de ces plages est équilibrée sur l’ensemble du système.The partition key is used to partition data into ranges and these ranges are load-balanced across the system. Cela signifie que les conventions de nommage telles que l’ordre lexical (par exemple, msftpayroll, msftperformance, msftemployees, etc.) ou à l’aide d’un horodatage (log20160101, log20160102, log20160102, etc.) utiliseront les partitions potentiellement en colocation sur le même serveur de partition, jusqu’à ce qu’une opération de fractionnement d’équilibrage de charge les fractionne en plages plus petites.This means naming conventions such as lexical ordering (for example, msftpayroll, msftperformance, msftemployees, etc.) or using time-stamps (log20160101, log20160102, log20160102, etc.) will lend itself to the partitions being potentially colocated on the same partition server, until a load-balancing operation splits them out into smaller ranges. Par exemple, tous les objets blob d’un conteneur peuvent être fournis par un même serveur jusqu'à ce que la charge sur ces objets blob nécessite un rééquilibrage plus approfondi des plages de la partition.For example, all blobs within a container can be served by a single server until the load on these blobs requires further rebalancing of the partition ranges. De même, un groupe de comptes faiblement chargés avec leurs noms classés par ordre lexical peut être pris en charge par un même serveur jusqu'à ce que la charge sur un ou tous ces comptes nécessite qu’ils soient répartis entre plusieurs serveurs de partitions.Similarly, a group of lightly loaded accounts with their names arranged in lexical order may be served by a single server until the load on one or all of these accounts require them to be split across multiple partitions servers. Chaque opération d’équilibrage de charge peut affecter la latence des appels de stockage lors de l’opération.Each load-balancing operation may impact the latency of storage calls during the operation. La capacité du système à gérer une hausse soudaine du trafic vers une partition est limitée par la scalabilité d’un serveur à partition unique jusqu’à ce que l’opération d’équilibrage de charge intervienne et rééquilibre la plage clé de la partition.The system's ability to handle a sudden burst of traffic to a partition is limited by the scalability of a single partition server until the load-balancing operation kicks-in and rebalances the partition key range.

Vous pouvez suivre quelques bonnes pratiques pour réduire la fréquence de ces opérations.You can follow some best practices to reduce the frequency of such operations.

  • Examinez attentivement la convention de nommage que vous utilisez pour les comptes, conteneurs, objets blob, tables et files d’attente.Examine the naming convention you use for accounts, containers, blobs, tables, and queues, closely. Vous pouvez ajouter un préfixe aux noms de comptes avec un hachage à 3 chiffres à l'aide d'une fonction de hachage qui correspond le mieux à vos besoins.Consider prefixing account names with a 3-digit hash using a hashing function that best suits your needs.
  • Si vous organisez vos données à l'aide d'horodatages ou d’identificateurs numériques, vous devez veiller à ne pas utiliser des modèles de trafic « Ajouter après uniquement » ou « Ajouter avant uniquement ».If you organize your data using timestamps or numerical identifiers, you have to ensure you are not using an append-only (or prepend-only) traffic patterns. Ces modèles ne sont pas adaptés à un système de partitionnement basé sur des plages et risquent de diriger tout le trafic vers une partition unique, empêchant ainsi un équilibrage optimal de la charge sur le système.These patterns are not suitable for a range -based partitioning system, and could lead to all the traffic going to a single partition and limiting the system from effectively load balancing. Par exemple, si vos opérations quotidiennes utilisent un objet blob avec un horodatage comme aaaammjj, tout le trafic pour cette opération quotidienne est alors dirigé vers un objet unique pris en charge par un serveur à partition unique.For instance, if you have daily operations that use a blob object with a timestamp such as yyyymmdd, then all the traffic for that daily operation is directed to a single object, which is served by a single partition server. Vérifiez si les limites par objet blob et par partition répondent à vos besoins, et pensez à diviser cette opération en plusieurs objets blob si nécessaire.Look at whether the per blob limits and per partition limits meet your needs, and consider breaking this operation into multiple blobs if needed. De même, si vous stockez des données chronologiques dans vos tables, tout le trafic pourrait être dirigé vers la dernière partie de l'espace de noms de clé.Similarly, if you store time series data in your tables, all the traffic could be directed to the last part of the key namespace. Si vous devez utiliser des horodatages ou des ID numériques, ajoutez en préfixe un hachage à trois chiffres à l’ID ou, dans le cas des horodatages, ajoutez en préfixe la partie des secondes, par exemple ssaaaammjj.If you must use timestamps or numerical IDs, prefix the ID with a 3-digit hash, or in the case of timestamps prefix the seconds part of the time such as ssyyyymmdd. Si des opérations de listage et d'interrogation sont effectuées régulièrement, choisissez une fonction de hachage qui limite le nombre de vos requêtes.If listing and querying operations are routinely performed, choose a hashing function that will limit your number of queries. Dans d'autres cas, un préfixe aléatoire peut être suffisant.In other cases, a random prefix may be sufficient.
  • Pour plus d'informations sur le schéma de partitionnement utilisé dans Azure Storage, consultez le document SOSP disponible ici.For additional information on the partitioning scheme used in Azure Storage, read the SOSP paper here.

Mise en réseauNetworking

Bien que les appels d’API soient importants, les contraintes de réseau physiques de l’application ont souvent un impact majeur sur les performances.While the API calls matter, often the physical network constraints of the application have a significant impact on performance. Vous trouverez, ci-dessous, certaines des limitations auxquelles les utilisateurs peuvent être confrontés.The following describe some of limitations users may encounter.

Fonctionnalités réseau du clientClient Network Capability

DébitThroughput

Dans le cas de la bande passante, le problème est souvent dû aux capacités du client.For bandwidth, the problem is often the capabilities of the client. Par exemple, bien qu’un seul compte de stockage puisse gérer un débit de 10 Gbits/s ou plus en entrée (voir Objectifs d’évolutivité de bande passante), la vitesse réseau d’une petite instance Rôle de travail Azure ne permet qu’un débit d’environ 100 Mbits/s.For example, while a single storage account can handle 10 Gbps or more of ingress (see bandwidth scalability targets), the network speed in a "Small" Azure Worker Role instance is only capable of approximately 100 Mbps. Dans le cas des instances Azure plus importantes, les cartes réseau présentent une capacité supérieure. Si vous avez besoin de limites réseau plus élevées à partir d’un seul ordinateur, vous devez donc envisager d’utiliser une instance plus grande ou davantage de machines virtuelles.Larger Azure instances have NICs with greater capacity, so you should consider using a larger instance or more VMs if you need higher network limits from a single machine. Si vous accédez à un service de stockage à partir d’une application locale, alors la même règle s’applique : comprendre les capacités réseau du périphérique client et la connectivité réseau à l’emplacement de stockage Azure et l’améliorer selon vos besoins ou concevoir votre application conformément à ces capacités.If you are accessing a Storage service from an on premises application, then the same rule applies: understand the network capabilities of the client device and the network connectivity to the Azure Storage location and either improve them as needed or design your application to work within their capabilities.

Qualité de la liaisonLink Quality

Comme c’est le cas pour toute utilisation du réseau, veuillez tenir compte du fait que les conditions réseau qui génèrent des erreurs et une perte de paquets ralentissent le débit effectif.As with any network usage, be aware that network conditions resulting in errors and packet loss will slow effective throughput. L’utilisation de WireShark ou de NetMon peut vous aider à diagnostiquer ce problème.Using WireShark or NetMon may help in diagnosing this issue.

Ressources utilesUseful Resources

Pour plus d’informations sur les tailles de machines virtuelles et la bande passante allouée, consultez la rubrique Tailles des machines virtuelles ou Tailles des machines virtuelles Linux.For more information about virtual machine sizes and allocated bandwidth, see Windows VM sizes or Linux VM sizes.

EmplacementLocation

Dans un environnement distribué, le fait de placer le client à proximité du serveur se traduit par des performances optimales.In any distributed environment, placing the client near to the server delivers in the best performance. Pour accéder à Azure Storage avec un minimum de latence, votre client doit idéalement se trouver dans la même région Azure.For accessing Azure Storage with the lowest latency, the best location for your client is within the same Azure region. Par exemple, dans le cas d’un site web qui utilise Azure Storage, tous deux doivent se trouver dans la même région (USA Ouest ou Asie Sud-Est, par exemple).For example, if you have an Azure Web Site that uses Azure Storage, you should locate them both within a single region (for example, US West or Asia Southeast). Cela réduit à la fois la latence et les coûts. Au moment de la rédaction du présent document, l’utilisation de la bande passante dans une seule région était gratuite.This reduces the latency and the cost — at the time of writing, bandwidth usage within a single region is free.

Si votre application cliente n’est pas hébergée dans Azure (c’est le cas, par exemple, des applications pour appareil mobile ou des services d’entreprise locaux), le fait de placer le compte de stockage dans une région proche des appareils qui y accéderont se traduit généralement par une latence plus faible.If your client applications are not hosted within Azure (such as mobile device apps or on premises enterprise services), then again placing the storage account in a region near to the devices that will access it, will generally reduce latency. En cas de distribution à grande échelle de vos clients (par exemple, certains se trouvent en Amérique du Nord et d’autres en Europe), l’utilisation de plusieurs comptes de stockage peut s’avérer judicieuse : un dans une région de l’Amérique du Nord et l’autre dans une région d’Europe.If your clients are broadly distributed (for example, some in North America, and some in Europe), then you should consider using multiple storage accounts: one located in a North American region and one in a European region. Cela contribue à réduire la latence pour les utilisateurs des deux régions.This will help to reduce latency for users in both regions. Cette méthode est plus facile à implémenter si les données stockées par l’application sont propres à certains utilisateurs, et elle ne nécessite pas de réplication des données entre différents comptes de stockage.This approach is easier to implement if the data the application stores is specific to individual users, and does not require replicating data between storage accounts. Pour une distribution du contenu à grande échelle, un CDN est recommandé. Pour plus d’informations à ce sujet, voir la section suivante.For broad content distribution, a CDN is recommended – see the next section for more details.

Distribution de contenuContent Distribution

Il arrive qu’une application doive diffuser le même contenu vers plusieurs utilisateurs situés au sein d’une même région ou dans des régions différentes. Il peut s’agir, par exemple, d’une vidéo de démonstration d’un produit utilisée sur la page d’accueil d’un site web.Sometimes, an application needs to serve the same content to many users (for example, a product demo video used in the home page of a website), located in either the same or multiple regions. Dans ce cas, vous devez utiliser un réseau de distribution de contenu (CDN), tel que le CDN Azure, qui utilise le stockage Azure comme origine des données.In this scenario, you should use a Content Delivery Network (CDN) such as Azure CDN, and the CDN would use Azure storage as the origin of the data. Contrairement à un compte Azure Storage qui existe dans une seule région et qui ne peut pas diffuser de contenu avec une faible latence vers d’autres régions, le CDN Azure utilise des serveurs dans plusieurs centres de données répartis dans le monde entier.Unlike an Azure Storage account that exists in a single region and that cannot deliver content with low latency to other regions, Azure CDN uses servers in multiple data centers around the world. De plus, un CDN peut généralement prendre en charge des limites de sortie bien plus élevées qu’un compte de stockage unique.Additionally, a CDN can typically support much higher egress limits than a single storage account.

Pour plus d’informations sur le CDN Azure, voir la page CDN Azure.For more information about Azure CDN, see Azure CDN.

Utilisation de SAP et de CORSUsing SAS and CORS

Lorsque vous devez autoriser du code, tel que JavaScript, dans le navigateur web d’un utilisateur ou une application pour téléphone mobile afin d’accéder à des données dans le stockage Azure, une méthode consiste à utiliser une application dans un rôle web en tant que proxy : l’appareil de l’utilisateur s’authentifie avec le rôle web, qui à son tour autorise l’accès aux ressources de stockage.When you need to authorize code such as JavaScript in a user's web browser or a mobile phone app to access data in Azure Storage, one approach is to use an application in web role as a proxy: the user's device authenticates with the web role, which in turn authorizes access to storage resources. Vous évitez ainsi d’exposer vos clés de compte de stockage sur des appareils non sécurisés.In this way, you can avoid exposing your storage account keys on insecure devices. Cependant, cela place une surcharge importante sur le rôle web, dans la mesure où toutes les données transférées entre l’appareil de l’utilisateur et le service de stockage doivent transiter par ce rôle.However, this places a significant overhead on the web role because all the data transferred between the user's device and the storage service must pass through the web role. Vous pouvez éviter d’utiliser un rôle web comme proxy pour le service de stockage en utilisant des signatures d’accès partagé (SAP), combinées parfois à des en-têtes CORS (Partage des ressources cross-origin).You can avoid using a web role as a proxy for the storage service by using Shared Access Signatures (SAS), sometimes in conjunction with Cross-Origin Resource Sharing headers (CORS). Grâce au modèle SAP, vous pouvez autoriser l’appareil de votre utilisateur à adresser directement des demandes à un service de stockage par le biais d’un jeton à accès limité.Using SAS, you can allow your user's device to make requests directly to a storage service by means of a limited access token. Par exemple, si un utilisateur souhaite télécharger une photo vers votre application, votre rôle web peut générer et envoyer à l’appareil de cet utilisateur un jeton SAP qui accordera des autorisations en écriture sur un conteneur ou un objet blob spécifique au cours des 30 prochaines minutes (au terme desquelles le jeton SAP expirera).For example, if a user wants to upload a photo to your application, your web role can generate and send to the user's device a SAS token that grants permission to write to a specific blob or container for the next 30 minutes (after which the SAS token expires).

En règle générale, un navigateur n’autorise pas le code JavaScript d’une page hébergée par un site web sur un domaine à effectuer des opérations spécifiques telles que « PUT » sur un autre domaine.Normally, a browser will not allow JavaScript in a page hosted by a website on one domain to perform specific operations such as a "PUT" to another domain. Par exemple, si vous hébergez un rôle web sur « contosomarketing.cloudapp.net » et que vous souhaitez utiliser du code JavaScript côté client pour charger un objet blob dans votre compte de stockage sur « contosoproducts.blob.core.windows.net », la stratégie « same origin policy » du navigateur interdit cette opération.For example, if you host a web role at "contosomarketing.cloudapp.net," and want to use client-side JavaScript to upload a blob to your storage account at "contosoproducts.blob.core.windows.net," the browsers "same origin policy" will forbid this operation. CORS est une fonctionnalité de navigateur qui autorise le domaine cible (dans ce cas, le compte de stockage) à indiquer au navigateur qu’il fait confiance aux demandes en provenance du domaine source (dans ce cas, le rôle web).CORS is a browser feature that allows the target domain (in this case the storage account) to communicate to the browser that it trusts requests originating in the source domain (in this case the web role).

Ces deux technologies vous aident à éviter toute charge inutile (ainsi que les goulots d’étranglement) au niveau de votre application web.Both of these technologies can help you avoid unnecessary load (and bottlenecks) on your web application.

Ressources utilesUseful Resources

Pour plus d’informations sur les signatures d’accès partagé, consultez l’article Signatures d’accès partagé, partie 1 : Présentation du modèle SAP.For more information about SAS, see Shared Access Signatures, Part 1: Understanding the SAS Model.

Pour plus d’informations sur CORS, consultez Prise en charge du service Partage des ressources cross-origin (CORS) pour les services Azure Storage.For more information about CORS, see Cross-Origin Resource Sharing (CORS) Support for the Azure Storage Services.

Mise en cacheCaching

Récupération de donnéesGetting Data

En règle générale, il est préférable de récupérer des données d’un service à une seule reprise plutôt que deux fois.In general, getting data from a service once is better than getting it twice. Prenons l’exemple d’une application web MVC exécutée dans un rôle web qui a déjà récupéré un objet blob de 50 Mo du service de stockage afin de le diffuser comme contenu à un utilisateur.Consider the example of an MVC web application running in a web role that has already retrieved a 50-MB blob from the storage service to serve as content to a user. L’application pourra, par la suite, récupérer ce même objet blob chaque fois qu’un utilisateur en fera la demande ou le mettre en cache sur un disque local et réutiliser cette version mise en cache pour les demandes ultérieures de l’utilisateur.The application could then retrieve that same blob every time a user requests it, or it could cache it locally to disk and reuse the cached version for subsequent user requests. De plus, lorsqu’un utilisateur demandera les données, l’application pourra émettre une commande GET avec un en-tête conditionnel pour l’heure de modification, évitant ainsi la récupération de l’intégralité de l’objet blob s’il n’a pas été modifié.Furthermore, whenever a user requests the data, the application could issue GET with a conditional header for modification time, which would avoid getting the entire blob if it hasn't been modified. Vous pouvez appliquer ce même schéma à l’utilisation des entités de table.You can apply this same pattern to working with table entities.

Dans certains cas, vous pouvez déterminer que votre application part du principe que l’objet blob reste valide pendant une courte période après sa récupération, et que, au cours de cette période, elle ne doit pas vérifier si l’objet blob a été modifié.In some cases, you may decide that your application can assume that the blob remains valid for a short period after retrieving it, and that during this period the application does not need to check if the blob was modified.

Les données de configuration, de recherche et d’autres données toujours utilisées par l’application constituent de parfaits candidats pour la mise en cache.Configuration, lookup, and other data that are always used by the application are great candidates for caching.

Pour savoir comment faire en sorte que les propriétés d’un objet blob détectent la date de la dernière modification à l’aide de .NET, consultez Configuration et récupération des propriétés et des métadonnées.For an example of how to get a blob's properties to discover the last modified date using .NET, see Set and Retrieve Properties and Metadata. Pour plus d’informations sur les téléchargements conditionnels, consultez Spécification d’en-têtes conditionnels pour les opérations de Service Blob.For more information about conditional downloads, see Conditionally Refresh a Local Copy of a Blob.

Téléchargement de données par lotsUploading Data in Batches

Dans certains scénarios d’application, vous pouvez agréger des données en local, puis les télécharger périodiquement dans un lot au lieu de les télécharger immédiatement une à une.In some application scenarios, you can aggregate data locally, and then periodically upload it in a batch instead of uploading each piece of data immediately. Par exemple, une application web peut conserver un fichier journal des activités : l’application peut soit télécharger, sous la forme d’une entité de table, les détails de chaque activité lorsqu’elle se produit (ce qui implique de nombreuses opérations de stockage), soit enregistrer les détails de l’activité dans un fichier journal local, puis les télécharger régulièrement vers un objet blob sous la forme d’un fichier délimité.For example, a web application might keep a log file of activities: the application could either upload details of every activity as it happens as a table entity (which requires many storage operations), or it could save activity details to a local log file, and then periodically upload all activity details as a delimited file to a blob. Si chaque entrée du journal a une taille de 1 Ko, vous pouvez en charger des milliers au cours d’une seule transaction « Put Blob » (vous pouvez charger un objet d’une taille maximale de 64 Mo au cours d’une seule transaction).If each log entry is 1 KB in size, you can upload thousands in a single "Put Blob" transaction (you can upload a blob of up to 64 MB in size in a single transaction). Si l’ordinateur local tombe en panne avant le chargement, vous pouvez perdre des données de journal : le développeur de l’application doit penser à la possibilité d’une défaillance d’appareil client ou de chargement.If the local machine crashes prior to the upload, you will potentially lose some log data: the application developer must design for the possibility of client device or upload failures. Si les données d’activité doivent être téléchargées pour un intervalle de temps (et pas seulement pour une seule activité), il est préférable d’utiliser des objets blob plutôt que des tables.If the activity data needs to be downloaded for timespans (not just single activity), then blobs are recommended over tables.

Configuration .NET.NET Configuration

Si vous utilisez .NET Framework, vous trouverez dans cette section plusieurs paramètres de configuration rapide que vous pouvez appliquer pour améliorer sensiblement les performances.If using the .NET Framework, this section lists several quick configuration settings that you can use to make significant performance improvements. Si vous utilisez un autre langage, vérifiez si des concepts similaires y sont associés.If using other languages, check to see if similar concepts apply in your chosen language.

Augmentation de la limite de connexions par défautIncrease default connection limit

Dans .NET, le code suivant augmente la limite de connexions par défaut (qui est généralement de 2 dans un environnement client ou de 10 dans un environnement de serveur) à 100.In .NET, the following code increases the default connection limit (which is usually 2 in a client environment or 10 in a server environment) to 100. En règle générale, vous devez définir la valeur sur environ le nombre de threads utilisés par votre application.Typically, you should set the value to approximately the number of threads used by your application.

ServicePointManager.DefaultConnectionLimit = 100; //(Or More)  

Vous devez définir la limite de connexions avant d’ouvrir une connexion.You must set the connection limit before opening any connections.

Pour les autres langages de programmation, voir la documentation correspondante pour savoir comment définir la limite de connexions.For other programming languages, see that language's documentation to determine how to set the connection limit.

Pour plus d’informations, consultez le billet de blog Services web : connexions simultanées.For more information, see the blog post Web Services: Concurrent Connections.

Augmentation du nombre minimum de threads du pool de threads en cas d’utilisation de code synchrone avec Async TasksIncrease ThreadPool Min Threads if using synchronous code with Async Tasks

Ce code augmente le nombre minimum de threads du pool de threads :This code will increase the thread pool min threads:

ThreadPool.SetMinThreads(100,100); //(Determine the right number for your application)  

Pour plus d’informations, consultez Méthode ThreadPool.SetMinThreads.For more information, see ThreadPool.SetMinThreads Method.

Utilisation du nettoyage de la mémoire de .NET 4.5Take advantage of .NET 4.5 Garbage Collection

Utilisez .NET 4.5 ou version ultérieure pour que l’application cliente tire parti des améliorations de la fonctionnalité de nettoyage de la mémoire du serveur sur le plan des performances.Use .NET 4.5 or later for the client application to take advantage of performance improvements in server garbage collection.

Pour plus d'informations, consultez l'article Présentation des améliorations des performances de .NET 4.5.For more information, see the article An Overview of Performance Improvements in .NET 4.5.

Parallélisme illimitéUnbounded Parallelism

Le parallélisme peut améliorer sensiblement les performances. Soyez toutefois prudent lorsque vous utilisez le parallélisme illimité (nombre de threads et/ou de demandes parallèles illimité) pour charger ou télécharger des données, ou lors de l’utilisation de plusieurs rôles de travail pour accéder à plusieurs partitions (conteneurs, files d’attente ou partitions de table) dans le même compte de stockage ou à plusieurs éléments d’une même partition.While parallelism can be great for performance, be careful about using unbounded parallelism (no limit on the number of threads and/or parallel requests) to upload or download data, using multiple workers to access multiple partitions (containers, queues, or table partitions) in the same storage account or to access multiple items in the same partition. Si vous optez pour un parallélisme illimité, votre application peut dépasser les capacités de l’appareil client ou les objectifs d’extensibilité du compte de stockage, ce qui se traduit par des temps de latence plus importants et par une limitation.If the parallelism is unbounded, your application can exceed the client device's capabilities or the storage account's scalability targets resulting in longer latencies and throttling.

Outils et bibliothèques clientes de stockageStorage Client Libraries and Tools

Utilisez toujours la version la plus récente des outils et bibliothèques clientes fournis par Microsoft.Always use the latest Microsoft provided client libraries and tools. Au moment de la rédaction du présent document, des bibliothèques clientes étaient disponibles pour .NET, Windows Phone, Windows Runtime, Java et C++, et des bibliothèques en version préliminaire sont également disponibles pour d’autres langages.At the time of writing, there are client libraries available for .NET, Windows Phone, Windows Runtime, Java, and C++, as well as preview libraries for other languages. Microsoft a, en outre, publié des cmdlets PowerShell et des commandes de l’interface de ligne de commande, utilisables avec Azure Storage.In addition, Microsoft has released PowerShell cmdlets and Azure CLI commands for working with Azure Storage. Microsoft s’attelle au développement de ces outils dans une optique de performances, veille à leur mise à jour continue avec les versions de service les plus récentes et s’assure qu’ils répondent, en interne, à la plupart des pratiques éprouvées en termes de performances.Microsoft actively develops these tools with performance in mind, keeps them up-to-date with the latest service versions, and ensures they handle many of the proven performance practices internally.

TentativesRetries

Limitation/Serveur occupéThrottling/ServerBusy

Dans certains cas, il se peut que le service de stockage limite votre application ou qu’il soit simplement incapable de répondre à la demande en raison d’une situation temporaire, et renvoie alors un message « 503 Serveur occupé » ou « 500 Délai d’expiration de l’opération ».In some cases, the storage service may throttle your application or may simply be unable to serve the request due to some transient condition and return a "503 Server busy" message or "500 Timeout". Cela peut se produire si votre application s’approche de l’un des objectifs d’extensibilité ou si le système rééquilibre vos données partitionnées pour permettre un débit plus élevé.This can happen if your application is approaching any of the scalability targets, or if the system is rebalancing your partitioned data to allow for higher throughput. L’application cliente doit généralement réessayer l’opération qui provoque cette erreur : retenter la même demande ultérieurement peut réussir.The client application should typically retry the operation that causes such an error: attempting the same request later can succeed. Cependant, si le service de stockage limite votre application en raison d’un dépassement des objectifs d’extensibilité, ou si le service n’a pas été en mesure de répondre à la demande pour une autre raison, effectuer des nouvelles tentatives agressives ne fait généralement qu’aggraver le problème.However, if the storage service is throttling your application because it is exceeding scalability targets, or even if the service was unable to serve the request for some other reason, aggressive retries usually make the problem worse. C’est pourquoi il est conseillé d’opter pour une interruption exponentielle (il s’agit du comportement par défaut des bibliothèques clientes).For this reason, you should use an exponential back off (the client libraries default to this behavior). Votre application peut, par exemple, effectuer une nouvelle tentative après 2 secondes, puis 4 secondes, 10 secondes, 30 secondes avant d’abandonner complètement.For example, your application may retry after 2 seconds, then 4 seconds, then 10 seconds, then 30 seconds, and then give up completely. Cela se traduit par un allégement sensible de la charge de l’application sur le service, au lieu d’aggraver le problème.This behavior results in your application significantly reducing its load on the service rather than exacerbating any problems.

Les erreurs de connectivité ne sont pas dues à une limitation et sont généralement temporaires. Dès lors, de nouvelles tentatives peuvent être effectuées immédiatement.Connectivity errors can be retried immediately, because they are not the result of throttling and are expected to be transient.

Erreurs non renouvelablesNon-Retryable Errors

Les bibliothèques clientes peuvent faire la distinction entre les erreurs renouvelables et celles qui ne le sont pas.The client libraries are aware of which errors are retry-able and which are not. Cependant, si vous écrivez votre propre code par rapport à l’API REST de stockage, n’oubliez pas certaines erreurs non renouvelables : par exemple, une réponse 400 (Bad Request) indique que l’application cliente a envoyé une demande qui n’a pas pu être traitée car elle n’était pas au format attendu.However, if you are writing your own code against the storage REST API, remember there are some errors that you should not retry: for example, a 400 (Bad Request) response indicates that the client application sent a request that could not be processed because it was not in an expected form. Renvoyer cette demande générera à chaque fois la même réponse. La renouveler ne sert donc à rien !Resending this request will result the same response every time, so there is no point in retrying it. Si vous écrivez votre propre code pour l’API REST de stockage, vous devez connaître la signification des codes d’erreur et, le cas échéant, la méthode de renouvellement à appliquer pour chacun d’eux.If you are writing your own code against the storage REST API, be aware of what the error codes mean and the proper way to retry (or not) for each of them.

Ressources utilesUseful Resources

Pour plus d’informations sur les codes d’erreur de stockage, voir la page Codes d’état et codes d’erreur sur le site web Microsoft Azure.For more information about storage error codes, see Status and Error Codes on the Microsoft Azure web site.

Objets blobBlobs

Outre les pratiques éprouvées pour Tous les services décrites précédemment, les pratiques ci-dessous s'appliquent spécifiquement au service BLOB.In addition to the proven practices for All Services described previously, the following proven practices apply specifically to the blob service.

Objectifs d’extensibilité propres aux objets blobBlob-Specific Scalability Targets

Plusieurs clients accédant simultanément à un seul objetMultiple clients accessing a single object concurrently

Si vous avez un grand nombre de clients qui accèdent simultanément à un seul objet, vous devrez prendre en compte les objectifs de scalabilité par compte de stockage et par objet.If you have a large number of clients accessing a single object concurrently, you will need to consider per object and storage account scalability targets. Le nombre exact de clients qui peuvent accéder à un objet unique varie en fonction de facteurs tels que le nombre de clients demandant l’accès à l’objet simultanément, la taille de l’objet, les conditions réseau, etc.The exact number of clients that can access a single object will vary depending on factors such as the number of clients requesting the object simultaneously, the size of the object, network conditions etc.

Si l’objet peut être distribué par le biais d’un CDN, comme les images ou les vidéos provenant d’un site web, vous devez utiliser un CDN.If the object can be distributed through a CDN such as images or videos served from a website, then you should use a CDN. Voir ici.See here.

Dans d’autres scénarios tels que les simulations scientifiques où les données sont confidentielles, vous disposez de deux options.In other scenarios such as scientific simulations where the data is confidential you have two options. La première consiste à échelonner l’accès de votre charge de travail de façon à ce que l’objet soit accessible sur une période de temps au lieu d’un accès simultané.The first is to stagger your workload's access such that the object is accessed over a period of time vs being accessed simultaneously. Sinon, vous pouvez copier temporairement l’objet sur plusieurs comptes de stockage pour améliorer le nombre total d’E/S par objet et sur les comptes de stockage.Alternatively, you can temporarily copy the object to multiple storage accounts thus increasing the total IOPS per object and across storage accounts. Dans un test limité, nous avons constaté qu’environ 25 machines virtuelles pouvaient télécharger simultanément un objet blob de 100 Go (chaque machine virtuelle téléchargeait en parallèle à l’aide de 32 threads).In limited testing, we found that around 25 VMs could simultaneously download a 100-GB blob in parallel (each VM was parallelizing the download using 32 threads). Si vous avez 100 clients devant accéder à l’objet, copiez-le dans un deuxième compte de stockage et attribuez l’accès au premier objet blob aux 50 premières machines virtuelles, puis les 50 machines virtuelles suivantes accèdent au deuxième objet blob.If you had 100 clients needing to access the object, first copy it to a second storage account and then have the first 50 VMs access the first blob and the second 50 VMs access the second blob. Les résultats varient selon le comportement de vos applications. Nous vous conseillons de tester ceci pendant la conception.Results will vary depending on your applications behavior so you should test this during design.

Bande passante et opérations par objet blobBandwidth and operations per Blob

Le débit maximal en lecture ou en écriture sur un objet blob unique est de 60 Mo/seconde (soit environ 480 Mbits/s), ce qui est supérieur aux capacités de nombreux réseaux côté client (notamment la carte réseau physique qui équipe l’appareil client).You can read or write to a single blob at up to a maximum of 60 MB/second (this is approximately 480 Mbps, which exceeds the capabilities of many client-side networks (including the physical NIC on the client device). De plus, un seul objet blob prend en charge plus de 500 demandes par seconde.In addition, a single blob supports up to 500 requests per second. Si vous risquez de dépasser ces limites lorsque plusieurs clients doivent lire le même objet blob, il est conseillé d’utiliser un CDN pour distribuer l’objet blob.If you have multiple clients that need to read the same blob and you might exceed these limits, you should consider using a CDN for distributing the blob.

Pour plus d’informations sur le débit cible pour les objets blob, consultez Objectifs de performance et d’extensibilité d’Azure Storage.For more information about target throughput for blobs, see Azure Storage Scalability and Performance Targets.

Copie et déplacement d’objets blobCopying and Moving Blobs

Copie d’un objet blobCopy Blob

L’API REST de stockage version 2012-02-12 a introduit la fonctionnalité utile de copier des objets blob entre les comptes : une application cliente peut indiquer au service de stockage de copier un objet blob d’une autre source (éventuellement dans un compte de stockage différent), puis de laisser au service le soin d’effectuer la copie de manière asynchrone.The storage REST API version 2012-02-12 introduced the useful ability to copy blobs across accounts: a client application can instruct the storage service to copy a blob from another source (possibly in a different storage account), and then let the service perform the copy asynchronously. Cela peut réduire sensiblement la bande passante requise pour l’application lorsque vous faites migrer des données depuis d’autres comptes de stockage, dans la mesure où vous ne devez pas envoyer et télécharger les données.This can significantly reduce the bandwidth needed for the application when you are migrating data from other storage accounts because you do not need to download and upload the data.

Il convient cependant de tenir compte du fait que lorsque vous effectuez une copie entre des comptes de stockage, vous ne pouvez pas savoir avec certitude quand l’opération prendra fin.One consideration, however, is that, when copying between storage accounts, there is no time guarantee on when the copy will complete. Si votre application doit procéder à une copie rapide d’un objet blob sous votre supervision, il peut être préférable de le copier en le téléchargeant sur une machine virtuelle, puis en le transférant vers la destination.If your application needs to complete a blob copy quickly under your control, it may be better to copy the blob by downloading it to a VM and then uploading it to the destination. Pour que cette opération se déroule dans les meilleures conditions possibles, assurez-vous que la copie est effectuée par une machine virtuelle exécutée dans la même région Azure, sans quoi les conditions réseau affecteront plus que probablement les performances de copie.For full predictability in that situation, ensure that the copy is performed by a VM running in the same Azure region, or else network conditions may (and probably will) affect your copy performance. Vous pouvez, en outre, surveiller la progression d’une copie asynchrone via un programme.In addition, you can monitor the progress of an asynchronous copy programmatically.

Les copies effectuées au sein d’un même compte de stockage sont généralement plus rapides.Copies within the same storage account itself are generally completed quickly.

Pour plus d’informations, consultez Copie d’un objet blob.For more information, see Copy Blob.

Utilisation d’AzCopyUse AzCopy

L’équipe Stockage Azure a développé un outil en ligne de commande baptisé « AzCopy », destiné à faciliter le transfert en bloc de nombreux objets blob entre des comptes de stockage.The Azure Storage team has released a command-line tool "AzCopy" that is meant to help with bulk transferring many blobs to, from, and across storage accounts. Cet outil est optimisé pour ce scénario et peut générer des taux de transfert élevés.This tool is optimized for this scenario, and can achieve high transfer rates. Il est vivement conseillé de l’utiliser pour les opérations de chargement, de téléchargement et de copie en bloc.Its use is encouraged for bulk upload, download, and copy scenarios. Pour plus d’informations et pour accéder au téléchargement, consultez Transfert de données avec l’utilitaire de ligne de commande AzCopy.To learn more about it and download it, see Transfer data with the AzCopy Command-Line Utility.

Service Azure Import/ExportAzure Import/Export Service

Pour les gros volumes de données (plus de 1 To), Stockage Azure propose le service Import/Export, qui permet de charger et de télécharger des données à partir d’un stockage d’objets blob en expédiant des disques durs.For large volumes of data (more than 1 TB), the Azure Storage offers the Import/Export service, which allows for uploading and downloading from blob storage by shipping hard drives. Vous pouvez copier vos données sur un disque dur et l’envoyer à Microsoft en vue du transfert des données, ou envoyer un disque dur vierge à Microsoft en vue de leur téléchargement.You can put your data on a hard drive and send it to Microsoft for upload, or send a blank hard drive to Microsoft to download data. Pour plus d'informations, consultez Utilisation du service Import/Export Microsoft Azure pour transférer des données vers le stockage d'objets blob.For more information, see Use the Microsoft Azure Import/Export Service to Transfer Data to Blob Storage. Cela peut se révéler bien plus pratique que de transférer un tel volume de données sur le réseau.This can be much more efficient than uploading/downloading this volume of data over the network.

Utilisation de métadonnéesUse metadata

Le service BLOB prend en charge les demandes HEAD, lesquelles peuvent inclure des métadonnées sur un objet blob.The blob service supports head requests, which can include metadata about the blob. Par exemple, si votre application doit extraire les données EXIF d’une photo, elle peut récupérer la photo en question, puis procéder à l’extraction.For example, if your application needed the EXIF data out of a photo, it could retrieve the photo and extract it. Pour économiser la bande passante et améliorer les performances, votre application peut stocker les données EXIF dans les métadonnées de l’objet blob quand l’application a chargé la photo : vous pouvez ensuite récupérer les données EXIF dans les métadonnées à l’aide d’une simple requête HEAD, ce qui permet d’économiser beaucoup de bande passante et de temps de traitement, nécessaires pour extraire les données EXIF chaque fois que l’objet blob est lu.To save bandwidth and improve performance, your application could store the EXIF data in the blob's metadata when the application uploaded the photo: you can then retrieve the EXIF data in metadata using only a HEAD request, saving significant bandwidth, and the processing time needed to extract the EXIF data each time the blob is read. Cela s’avère particulièrement utile lorsque vous avez simplement besoin des métadonnées, et non de tout le contenu d’un objet blob.This would be useful in scenarios where you only need the metadata, and not the full content of a blob. Un maximum de 8 Ko de métadonnées peut être stocké par objet blob (le service refusera les demandes de stockage supérieures). Si vos données ne respectent pas cette taille, vous ne pourrez pas utiliser cette méthode.Only 8 KB of metadata can be stored per blob (the service will not accept a request to store more than that), so if the data does not fit in that size, you may not be able to use this approach.

Pour savoir comment récupérer les métadonnées d’un objet blob à l’aide de .NET, consultez Configuration et récupération des propriétés et des métadonnées.For an example of how to get a blob's metadata using .NET, see Set and Retrieve Properties and Metadata.

Téléchargement rapideUploading Fast

Pour télécharger les objets blob rapidement, la première question est : téléchargez-vous un blob ou plusieurs ?To upload blobs fast, the first question to answer is: are you uploading one blob or many? Utilisez les instructions ci-dessous pour déterminer la méthode correcte en fonction de votre scénario.Use the below guidance to determine the correct method to use depending on your scenario.

Téléchargement rapide d’un objet blob volumineuxUploading one large blob quickly

Pour télécharger rapidement un seul objet blob de grande taille, votre application cliente doit télécharger ses blocs ou pages en parallèle (en tenant compte des objectifs d’extensibilité des différents objets blob et du compte de stockage dans son ensemble).To upload a single large blob quickly, your client application should upload its blocks or pages in parallel (being mindful of the scalability targets for individual blobs and the storage account as a whole). Les bibliothèques clientes de stockage RTM officielles fournies par Microsoft (.NET, Java) offrent cette possibilité.The official Microsoft-provided RTM Storage Client libraries (.NET, Java) have the ability to do this. Pour chacune des bibliothèques, utilisez l’objet ou la propriété indiqué ci-dessous pour définir le niveau de simultanéité :For each of the libraries, use the below specified object/property to set the level of concurrency:

  • .NET : définissez ParallelOperationThreadCount sur un objet BlobRequestOptions à utiliser..NET: Set ParallelOperationThreadCount on a BlobRequestOptions object to be used.
  • Java/Android : utilisez BlobRequestOptions.setConcurrentRequestCount()Java/Android: Use BlobRequestOptions.setConcurrentRequestCount()
  • Node.js : utilisez parallelOperationThreadCount sur les options de demande ou sur le service BLOB.Node.js: Use parallelOperationThreadCount on either the request options or on the blob service.
  • C++ : utilisez la méthode blob_request_options::set_parallelism_factor.C++: Use the blob_request_options::set_parallelism_factor method.

Téléchargement rapide de nombreux objets blobUploading many blobs quickly

Pour télécharger rapidement de nombreux objets blob, effectuez cette opération en parallèle.To upload many blobs quickly, upload blobs in parallel. Cela s’avère plus rapide que de télécharger des objets blob individuels avec des téléchargements de blocs parallèles, dans la mesure où le transfert est réparti entre plusieurs partitions du service de stockage.This is faster than uploading single blobs at a time with parallel block uploads because it spreads the upload across multiple partitions of the storage service. Dans le cas d’un objet blob unique, le débit pris en charge est seulement de 60 Mo/seconde (environ 480 Mbits/s).A single blob only supports a throughput of 60 MB/second (approximately 480 Mbps). Au moment de la rédaction, un compte LRS basé aux États-Unis prend en charge jusqu'à 20 Gbits/s entrée, qui est beaucoup plus que le débit pris en charge par un objet blob individuel.At the time of writing, a US-based LRS account supports up to 20-Gbps ingress, which is far more than the throughput supported by an individual blob. AzCopy effectue des téléchargements en parallèle et son utilisation est recommandée pour ce scénario.AzCopy performs uploads in parallel by default, and is recommended for this scenario.

Choix du type d’objet blob appropriéChoosing the correct type of blob

Azure Storage prend en charge deux types d’objet blob : de pages et de blocs.Azure Storage supports two types of blob: page blobs and block blobs. Pour un scénario d’utilisation donné, le type d’objet blob choisi affecte les performances et l’extensibilité de la solution.For a given usage scenario, your choice of blob type will affect the performance and scalability of your solution. Les objets blob de blocs sont utiles si vous souhaitez télécharger efficacement de grandes quantités de données : par exemple, une application cliente a besoin de télécharger des photos ou vidéos sur le stockage d’objets blob.Block blobs are appropriate when you want to upload large amounts of data efficiently: for example, a client application may need to upload photos or video to blob storage. Les objets blob de pages sont appropriées si l’application doit effectuer des écritures aléatoires sur les données : par exemple, les disques durs virtuels d’Azure sont stockés en tant qu’objets blob de pages.Page blobs are appropriate if the application needs to perform random writes on the data: for example, Azure VHDs are stored as page blobs.

Pour plus d’informations, consultez Présentation des objets blob de blocs, des objets blob d’ajout et des objets blob de pages.For more information, see Understanding Block Blobs, Append Blobs, and Page Blobs.

TablesTables

Outre les pratiques éprouvées pour Tous les services décrites précédemment, les pratiques ci-dessous s'appliquent spécifiquement au service de Table.In addition to the proven practices for All Services described previously, the following proven practices apply specifically to the table service.

Objectifs d’extensibilité propres aux tablesTable-Specific Scalability Targets

Outre les limitations de bande passante d’un compte de stockage complet, les tables possèdent leur propre limite d’extensibilité.In addition to the bandwidth limitations of an entire storage account, tables have the following specific scalability limit. Le système équilibre la charge à mesure que le trafic augmente. Cependant, en cas de salves de trafic, il peut s’avérer impossible d’obtenir immédiatement ce volume de débit.The system will load balance as your traffic increases, but if your traffic has sudden bursts, you may not be able to get this volume of throughput immediately. En cas de pic de trafic, une limitation et/ou des délais d’attente risquent de se produire tandis que le service de stockage décharge automatiquement votre table.If your pattern has bursts, you should expect to see throttling and/or timeouts during the burst as the storage service automatically load balances out your table. Une accélération progressive offre généralement de meilleurs résultats, dans la mesure où cela donne au système le temps d’équilibrer la charge de manière appropriée.Ramping up slowly generally has better results as it gives the system time to load balance appropriately.

Entités par seconde (compte)Entities per Second (Account)

S’agissant de l’accès aux tables, la limite de scalabilité est de 20 000 entités (d’une taille individuelle de 1 Ko) par seconde pour un compte.The scalability limit for accessing tables is up to 20,000 entities (1 KB each) per second for an account. En règle générale, chaque entité insérée, mise à jour, supprimée ou analysée est comptabilisée.In general, each entity that is inserted, updated, deleted, or scanned counts toward this target. Une insertion par lots composée de 100 entités compte donc pour 100 entités.So a batch insert that contains 100 entities would count as 100 entities. De même, une requête qui analyse 1 000 entités et en renvoie 5 compte pour 1 000 entités.A query that scans 1000 entities and returns 5 would count as 1000 entities.

Entités par seconde (partition)Entities per Second (Partition)

Dans une partition unique, l’objectif de scalabilité pour l’accès aux tables est de 2 000 entités (d’une taille individuelle de 1 Ko) par seconde, en utilisant le même mode de calcul que celui décrit dans la section précédente.Within a single partition, the scalability target for accessing tables is 2,000 entities (1 KB each) per second, using the same counting as described in the previous section.

ConfigurationConfiguration

Cette section décrit les paramètres de configuration rapide que vous pouvez utiliser pour améliorer sensiblement les performances du service de Table :This section lists several quick configuration settings that you can use to make significant performance improvements in the table service:

Utilisation de JSONUse JSON

Depuis la version 2013-08-15 du service de stockage, le service de Table prend en charge l’utilisation de JSON plutôt que le format AtomPub XML pour transférer des données de table.Beginning with storage service version 2013-08-15, the table service supports using JSON instead of the XML-based AtomPub format for transferring table data. Cela permet de réduire la taille de la charge utile de quelque 75 % et d’améliorer sensiblement les performances de votre application.This can reduce payload sizes by as much as 75% and can significantly improve the performance of your application.

Pour plus d’informations, consultez le billet Microsoft Azure Tables: Introducing JSON (Tables Microsoft Azure : Présentation du format JSON) et l’article Payload Format for Table Service Operations (Format de charge utile pour les opérations du service de Table).For more information, see the post Microsoft Azure Tables: Introducing JSON and Payload Format for Table Service Operations.

Désactivation de NagleNagle Off

L’algorithme de Nagle est utilisé à grande échelle sur les réseaux TCP/IP en vue d’améliorer les performances du réseau.Nagle's algorithm is widely implemented across TCP/IP networks as a means to improve network performance. Cependant, il n’est pas idéal dans toutes les situations (c’est le cas, par exemple, dans les environnements très interactifs).However, it is not optimal in all circumstances (such as highly interactive environments). Pour le stockage Azure, l’algorithme de Nagle a un impact négatif sur les performances des demandes adressées aux services de table et de file d’attente. Vous devez donc le désactiver si cela s’avère possible.For Azure Storage, Nagle's algorithm has a negative impact on the performance of requests to the table and queue services, and you should disable it if possible.

SchémaSchema

Le mode de représentation et d’interrogation de vos données constitue le principal facteur ayant une incidence sur les performances du service de Table.How you represent and query your data is the biggest single factor that affects the performance of the table service. Bien que chaque application soit différente, cette section énumère quelques pratiques générales concernant les points suivants :While every application is different, this section outlines some general proven practices that relate to:

  • Conception de tablesTable design
  • Requêtes efficacesEfficient queries
  • Mises à jour de données efficacesEfficient data updates

Tables et partitionsTables and partitions

Les tables sont divisées en partitions.Tables are divided into partitions. Toutes les entités stockées dans une partition partagent la même clé de partition et sont associées à une clé de ligne pour les identifier dans cette partition.Every entity stored in a partition shares the same partition key and has a unique row key to identify it within that partition. Les partitions offrent des avantages, mais elles s’accompagnent également de limites d’extensibilité.Partitions provide benefits but also introduce scalability limits.

  • Avantages : vous pouvez mettre à jour des entités d’une même partition au cours d’une seule transaction atomique par lots pouvant contenir jusqu’à 100 opérations de stockage distinctes (taille totale limite de 4 Mo).Benefits: You can update entities in the same partition in a single, atomic, batch transaction that contains up to 100 separate storage operations (limit of 4 MB total size). En partant du principe que le même nombre d’entités doit être récupéré, vous pouvez également interroger plus efficacement les données d’une seule partition que celles qui couvrent plusieurs partitions (vous trouverez d’autres conseils sur l’interrogation des données de table dans la suite de ce document).Assuming the same number of entities to be retrieved, you can also query data within a single partition more efficiently than data that spans partitions (though read on for further recommendations on querying table data).
  • Limite d’extensibilité : l’accès aux entités stockées dans une seule partition ne peut pas faire l’objet d’un équilibrage de la charge, car les partitions prennent en charge les transactions atomiques par lots.Scalability limit: Access to entities stored in a single partition cannot be load-balanced because partitions support atomic batch transactions. C’est pourquoi l’objectif d’extensibilité d’une partition de table individuelle est inférieur à celui du service de Table dans son ensemble.For this reason, the scalability target for an individual table partition is lower than for the table service as a whole.

Compte tenu des caractéristiques des tables et des partitions, il est conseillé d’adopter les principes de conception suivants :Because of these characteristics of tables and partitions, you should adopt the following design principles:

  • Les données que votre application cliente a fréquemment mises à jour ou interrogées dans la même unité de travail logique doivent être situées dans la même partition.Data that your client application frequently updated or queried in the same logical unit of work should be located in the same partition. Cela peut être dû au fait que votre application agrège les écritures ou que vous souhaitiez tirer parti d’opérations atomiques par lots.This may be because your application is aggregating writes, or because you want to take advantage of atomic batch operations. Ajoutons encore que les données d’une seule partition peuvent être interrogées plus efficacement dans une seule requête que les données de plusieurs partitions.Also, data in a single partition can be more efficiently queried in a single query than data across partitions.
  • Les données que votre application cliente n’insère pas, ne met pas à jour ou n’interroge pas dans la même unité de travail logique (requête unique ou mise à jour par lots) doivent être situées dans des partitions distinctes.Data that your client application does not insert/update or query in the same logical unit of work (single query or batch update) should be located in separate partitions. Notez que le nombre de clés de partition dans une seule table n’est pas limité. Le fait qu’il y ait plusieurs millions de clés de partition ne constitue donc pas un problème et n’a aucune incidence sur les performances.One important note is that there is no limit to the number of partition keys in a single table, so having millions of partition keys is not a problem and will not impact performance. Par exemple, si votre application est un site web populaire auquel les utilisateurs doivent se connecter, il peut être judicieux de choisir l’ID utilisateur comme clé de partition.For example, if your application is a popular website with user login, using the User ID as the partition key could be a good choice.

Partitions activesHot Partitions

On appelle « partition active » une partition qui reçoit un pourcentage disproportionné du trafic vers un compte et qui ne peut pas faire l’objet d’un équilibrage de la charge, car il s’agit d’une partition unique.A hot partition is one that is receiving a disproportionate percentage of the traffic to an account, and cannot be load balanced because it is a single partition. En règle générale, la création des partitions actives s’effectue de l’une des façons suivantes :In general, hot partitions are created one of two ways:

Modèles « Ajouter après uniquement » et « Ajouter avant uniquement »Append Only and Prepend Only patterns

Avec le modèle « Ajouter après uniquement », l’intégralité (ou la grande majorité) du trafic à destination d’une clé de partition donnée augmente et diminue en fonction de l’heure.The "Append Only" pattern is one where all (or nearly all) of the traffic to a given PK increases and decreases according to the current time. Par exemple, si votre application utilise la date du jour comme clé de partition pour les données de journal.An example is if your application used the current date as a partition key for log data. Par conséquent, toutes les insertions sont placées dans la dernière partition de votre table et le système ne peut pas équilibrer la charge, car l’ensemble des écritures va en fin de table.This results in all of the inserts going to the last partition in your table, and the system cannot load balance because all of the writes are going to the end of your table. Si le trafic à destination de cette partition dépasse l’objectif d’extensibilité au niveau de la partition, cela se traduit par une limitation.If the volume of traffic to that partition exceeds the partition-level scalability target, then it will result in throttling. Il est préférable de s’assurer que le trafic est envoyé vers plusieurs partitions, afin de permettre l’équilibrage de la charge des demandes sur votre table.It's better to ensure that traffic is sent to multiple partitions, to enable load balance the requests across your table.

Données à trafic élevéHigh-Traffic Data

Si votre schéma de partitionnement donne lieu à une seule partition qui comporte simplement les données qui sont beaucoup plus utilisées que d’autres partitions, le phénomène de limitation risque également de se présenter à mesure que cette partition unique s’approche de son objectif d’extensibilité.If your partitioning scheme results in a single partition that just has data that is far more used than other partitions, you may also see throttling as that partition approaches the scalability target for a single partition. Il est conseillé de faire en sorte que votre schéma de partitionnement ne génère pas une partition unique qui s’approche des objectifs d’extensibilité.It's better to make sure that your partition scheme results in no single partition approaching the scalability targets.

InterrogationQuerying

Cette section décrit les pratiques éprouvées concernant l’interrogation du service de Table.This section describes proven practices for querying the table service.

Étendue de requêteQuery Scope

Pour spécifier la plage des entités à interroger, vous pouvez procéder de plusieurs façons.There are several ways to specify the range of entities to query. Vous trouverez, ci-dessous, une brève description de chaque méthode.The following is a discussion of the uses of each.

En règle générale, il est conseillé d’éviter les analyses (requêtes d’une taille supérieure à une seule entité). Cependant, si vous devez procéder de la sorte, tâchez d’organiser vos données de façon à ce que les analyses les récupèrent sans qu’il faille examiner ou renvoyer de grandes quantités d’entités dont vous n’avez pas besoin.In general, avoid scans (queries larger than a single entity), but if you must scan, try to organize your data so that your scans retrieve the data you need without scanning or returning significant amounts of entities you don't need.

Requêtes de pointPoint Queries

Une requête de point récupère exactement une entité.A point query retrieves exactly one entity. Pour ce faire, elle spécifie la clé de partition et la clé de ligne de l’entité à récupérer.It does this by specifying both the partition key and row key of the entity to retrieve. Ces requêtes sont efficaces et nous vous conseillons de les utiliser dans la mesure du possible.These queries are efficient, and you should use them wherever possible.

Requêtes de partitionPartition Queries

Une requête de partition récupère un jeu de données qui partagent une clé de partition commune.A partition query is a query that retrieves a set of data that shares a common partition key. En règle générale, cette requête spécifie une plage de valeurs de clé de ligne ou une plage de valeurs pour une propriété d’entité, en plus d’une clé de partition.Typically, the query specifies a range of row key values or a range of values for some entity property in addition to a partition key. Les requêtes de partition sont moins efficaces que les requêtes de point et doivent être utilisées avec modération.These are less efficient than point queries, and should be used sparingly.

Requêtes de tableTable Queries

Une requête de table récupère un jeu d’entités ne partageant pas une clé de partition commune.A table query is a query that retrieves a set of entities that does not share a common partition key. Les requêtes de ce type ne sont pas efficaces et il est conseillé de les éviter dans la mesure du possible.These queries are not efficient and you should avoid them if possible.

Densité des requêtesQuery Density

S’agissant de l’efficacité des requêtes, un autre facteur important est le nombre d’entités renvoyées par rapport au nombre d’entités analysées pour obtenir le jeu renvoyé.Another key factor in query efficiency is the number of entities returned as compared to the number of entities scanned to find the returned set. Si votre application effectue une requête de table avec un filtre pour une valeur de propriété partagée par seulement 1 % des données, la requête analyse 100 entités pour chaque entité renvoyée.If your application performs a table query with a filter for a property value that only 1% of the data shares, the query will scan 100 entities for every one entity it returns. Les objectifs d’extensibilité de table abordés précédemment sont liés au nombre d’entités analysées et non au nombre d’entités retournées : une densité de requête faible peut facilement générer un service de table qui limite votre application, car il convient d’analyser de nombreuses entités pour récupérer l’entité que vous recherchez.The table scalability targets discussed previously all relate to the number of entities scanned, and not the number of entities returned: a low query density can easily cause the table service to throttle your application because it must scan so many entities to retrieve the entity you are looking for. Pour savoir comment éviter ce problème, consultez la section traitant de la dénormalisation ci-après.See the section below on denormalization for more information on how to avoid this.

Limitation du volume de données renvoyéLimiting the Amount of Data Returned
FiltrageFiltering

Lorsque vous savez qu’une requête va renvoyer des entités dont vous n’avez pas besoin dans l’application cliente, pensez à utiliser un filtre afin de réduire la taille du jeu renvoyé.Where you know that a query will return entities that you don't need in the client application, consider using a filter to reduce the size of the returned set. Bien que les entités non renvoyées au client soient comptabilisées dans les limites d’extensibilité, les performances de votre application s’en trouveront améliorées, compte tenu de la taille réduite de charge utile du réseau et de la réduction du nombre d’entités traitées par votre application cliente.While the entities not returned to the client still count toward the scalability limits, your application performance will improve because of the reduced network payload size and the reduced number of entities that your client application must process. Voir la remarque ci-dessus concernant la densité des requêtes. Les objectifs d’extensibilité faisant référence au nombre d’entités analysées, il se peut qu’une requête qui exclut de nombreuses entités donne toujours lieu à une limitation, même si le nombre d’entités renvoyées est faible.See above note on Query Density, however – the scalability targets relate to the number of entities scanned, so a query that filters out many entities may still result in throttling, even if few entities are returned.

ProjectionProjection

Si votre application cliente nécessite seulement un jeu limité de propriétés des entités de votre table, vous pouvez utiliser la projection pour limiter la taille du jeu de données renvoyé.If your client application needs only a limited set of properties from the entities in your table, you can use projection to limit the size of the returned data set. Comme c’est le cas avec le filtrage, cela permet de réduire la charge réseau et le traitement du client.As with filtering, this helps to reduce network load and client processing.

DénormalisationDenormalization

Contrairement à l’utilisation des bases de données relationnelles, les pratiques éprouvées pour interroger efficacement des données de table entraînent leur dénormalisation.Unlike working with relational databases, the proven practices for efficiently querying table data lead to denormalizing your data. Cette opération consiste à dupliquer les mêmes données dans plusieurs entités (une pour chaque clé utilisable pour rechercher les données) afin de réduire le nombre d’entités qu’une requête doit analyser pour rechercher les données dont le client a besoin, plutôt que d’analyser de grandes quantités d’entités pour rechercher les données dont votre application a besoin.That is, duplicating the same data in multiple entities (one for each key you may use to find the data) to minimize the number of entities that a query must scan to find the data the client needs, rather than having to scan large numbers of entities to find the data your application needs. Sur un site web de commerce électronique, par exemple, vous pouvez rechercher une commande en fonction de l’ID du client (rechercher les commandes de ce client) et de la date (rechercher les commandes passées à une date donnée).For example, in an e-commerce website, you may want to find an order both by the customer ID (give me this customer's orders) and by the date (give me orders on a date). Dans le stockage de tables, il est préférable de stocker l’entité (ou une référence à celle-ci) à deux reprises : une fois avec le nom de la table, la clé de partition et la clé de ligne afin de faciliter la recherche en fonction de l’ID de client, et une fois pour faciliter la recherche en fonction de la date.In Table Storage, it is best to store the entity (or a reference to it) twice – once with Table Name, PK, and RK to facilitate finding by customer ID, once to facilitate finding it by the date.

Insertion/Mise à jour/SuppressionInsert/Update/Delete

Cette section décrit les pratiques éprouvées concernant la modification des entités stockées dans le service de Table.This section describes proven practices for modifying entities stored in the table service.

Traitement par lotBatching

Dans Azure Storage, les transactions par lots sont connues sous le nom de transactions de groupe d’entités (ETG) ; toutes les opérations d’une ETG doivent être effectuées dans une partition unique d’une seule table.Batch transactions are known as Entity Group Transactions (ETG) in Azure Storage; all the operations within an ETG must be on a single partition in a single table. Lorsque cela s’avère possible, utilisez des ETG pour effectuer des opérations d’insertion, de mise à jour et de suppression par lots.Where possible, use ETGs to perform inserts, updates, and deletes in batches. Cela réduit le nombre d’allers-retours entre votre application cliente et le serveur, ainsi que le nombre de transactions facturables (une ETG est comptabilisée comme une seule transaction à des fins de facturation et peut contenir 100 opérations de stockage), et autorise les mises à jour atomiques (dans une ETG, toutes les opérations réussissent ou échouent).This reduces the number of round trips from your client application to the server, reduces the number of billable transactions (an ETG counts as a single transaction for billing purposes and can contain up to 100 storage operations), and enables atomic updates (all operations succeed or all fail within an ETG). L’utilisation des ETG peut apporter des avantages non négligeables dans les environnements où les temps de latence sont élevés, tels que les appareils mobiles.Environments with high latencies such as mobile devices will benefit greatly from using ETGs.

Opération UpsertUpsert

Lorsque cela s'avère possible, il est conseillé d'utiliser des opérations de table Upsert .Use table Upsert operations wherever possible. Il existe deux types d’opération Upsert ; tous deux peuvent se révéler plus efficaces que les opérations Insert et Update classiques :There are two types of Upsert, both of which can be more efficient than a traditional Insert and Update operations:

  • InsertOrMerge : utilisez cette opération lorsque vous souhaitez charger un sous-ensemble des propriétés de l’entité, mais ne savez pas si cette dernière existe déjà.InsertOrMerge: Use this when you want to upload a subset of the entity's properties, but aren't sure whether the entity already exists. Si elle existe, cet appel met à jour les propriétés incluses dans l’opération Upsert et laisse toutes les propriétés existantes en l’état. Si elle n’existe pas, cet appel insère la nouvelle entité.If the entity exists, this call updates the properties included in the Upsert operation, and leaves all existing properties as they are, if the entity does not exist, it inserts the new entity. Cela revient à utiliser la projection dans une requête, en ce sens que vous devez simplement télécharger les propriétés qui sont modifiées.This is similar to using projection in a query, in that you only need to upload the properties that are changing.
  • InsertOrReplace : utilisez cette opération lorsque vous souhaitez charger une toute nouvelle entité, mais ne savez pas si cette dernière existe déjà.InsertOrReplace: Use this when you want to upload an entirely new entity, but you aren't sure whether it already exists. Ne l’utilisez que lorsque vous n’avez aucun doute quant à la qualité de la nouvelle entité téléchargée, car elle écrase complètement l’ancienne entité.You should only use this when you know that the newly uploaded entity is entirely correct because it completely overwrites the old entity. Vous souhaitez, par exemple, mettre à jour l’entité qui stocke l’emplacement actuel d’un utilisateur et ce, que l’application ait déjà stocké ou non des données d’emplacement pour cet utilisateur ; la nouvelle entité d’emplacement est complète et vous n’avez besoin d’aucune information d’une entité précédente.For example, you want to update the entity that stores a user's current location regardless of whether or not the application has previously stored location data for the user; the new location entity is complete, and you do not need any information from any previous entity.
Stockage de séries de données dans une seule entitéStoring Data Series in a Single Entity

Parfois, une application stocke une série de données fréquemment nécessaires pour tout récupérer à la fois : par exemple, une application peut suivre l’utilisation du processeur au fil du temps pour tracer un graphique propagée des données à partir des dernières 24 heures.Sometimes, an application stores a series of data that it frequently needs to retrieve all at once: for example, an application might track CPU usage over time in order to plot a rolling chart of the data from the last 24 hours. Une méthode consiste à disposer d’une entité de table par heure, chaque entité représentant alors une heure donnée et stockant l’utilisation du processeur au cours de cette période.One approach is to have one table entity per hour, with each entity representing a specific hour and storing the CPU usage for that hour. Pour représenter ces données sur un graphique, l’application doit récupérer les entités qui contiennent les données des 24 dernières heures.To plot this data, the application needs to retrieve the entities holding the data from the 24 most recent hours.

Sinon, votre application peut stocker l'utilisation du processeur pour chaque heure sous la forme d'une propriété distincte d'une entité unique : pour mettre à jour chaque heure, votre application peut utiliser un seul appel InsertOrMerge Upsert pour mettre à jour la valeur de la dernière heure.Alternatively, your application could store the CPU usage for each hour as a separate property of a single entity: to update each hour, your application can use a single InsertOrMerge Upsert call to update the value for the most recent hour. Pour tracer les données, l’application doit récupérer une entité unique au lieu de 24, générant ainsi une requête efficace (voir ci-dessus la discussion sur étendue de requête).To plot the data, the application only needs to retrieve a single entity instead of 24, making for an efficient query (see above discussion on query scope).

Stockage de données structurées dans des objets blobStoring structured data in blobs

Les données structurées donnent parfois l’impression qu’elles devraient être placées dans les tables. Cependant, les plages d’entités sont toujours récupérées ensemble et peuvent être insérées par lots.Sometimes structured data feels like it should go in tables, but ranges of entities are always retrieved together and can be batch inserted. À cet égard, un fichier journal constitue un parfait exemple.A good example of this is a log file. Dans ce cas, vous pouvez regrouper plusieurs minutes de journalisation et les insérer. Vous récupérez alors plusieurs minutes de journalisation à la fois.In this case, you can batch several minutes of logs, insert them, and then you are always retrieving several minutes of logs at a time as well. Dans une optique de performances, il est préférable d’utiliser des objets blob plutôt que des tables, dans la mesure où vous pouvez réduire de manière significative le nombre d’objets écrits/renvoyés, ainsi que, généralement, le nombre de demandes qui doivent être effectuées.In this case, for performance, it's better to use blobs instead of tables, since you can significantly reduce the number of objects written/returned, as well as usually the number of requests that need made.

Files d'attenteQueues

Outre les pratiques éprouvées pour Tous les services décrites précédemment, les pratiques ci-dessous s'appliquent spécifiquement au service de file d’attente.In addition to the proven practices for All Services described previously, the following proven practices apply specifically to the queue service.

Limites d’extensibilitéScalability Limits

Une seule file d’attente peut traiter environ 2 000 messages (1 Ko chacun) par seconde (chaque AddMessage, GetMessage et DeleteMessage compte pour un message).A single queue can process approximately 2,000 messages (1 KB each) per second (each AddMessage, GetMessage, and DeleteMessage count as a message here). Si cela est insuffisant pour votre application, utilisez plusieurs files d’attente et répartissez les messages entre elles.If this is insufficient for your application, you should use multiple queues and spread the messages across them.

consultez les objectifs d’extensibilité actuels dans Objectifs de performance et d’extensibilité d’Azure Storage.View current scalability targets at Azure Storage Scalability and Performance Targets.

Désactivation de NagleNagle Off

Voir la section relative à la configuration de table qui traite de l’algorithme Nagle ; en règle générale, cet algorithme dégrade les performances des demandes de file d’attente et, de ce fait, vous devez le désactiver.See the section on table configuration that discusses the Nagle algorithm — the Nagle algorithm is generally bad for the performance of queue requests, and you should disable it.

Taille des messagesMessage Size

Évolutivité et les performances de la file d’attente diminuer en tant que la taille des messages augmente.Queue performance and scalability decrease as message size increases. Dans un message, placez uniquement les informations dont le destinataire a besoin.You should place only the information the receiver needs in a message.

Récupération par lotsBatch Retrieval

Vous pouvez récupérer jusqu’à 32 messages d’une file d’attente en une seule opération.You can retrieve up to 32 messages from a queue in a single operation. Cela contribue à réduire le nombre d’allers-retours avec l’application cliente, ce qui s’avère particulièrement utile pour les environnements où les temps de latence sont élevés, tels que les appareils mobiles.This can reduce the number of roundtrips from the client application, which is especially useful for environments, such as mobile devices, with high latency.

Intervalle d'interrogation de file d'attenteQueue Polling Interval

La plupart des applications interrogent une file d’attente pour les messages, ce qui peut représenter l’une des plus grandes sources de transactions pour cette application.Most applications poll for messages from a queue, which can be one of the largest sources of transactions for that application. Sélectionnez votre intervalle d’interrogation avec soin : une interrogation trop fréquente pourrait entraîner un rapprochement des objectifs d’extensibilité pour la file d’attente.Select your polling interval wisely: polling too frequently could cause your application to approach the scalability targets for the queue. Toutefois, à 200 000 transactions à 0,01 $ (au moment de la rédaction), un seul processeur interrogeant une fois par seconde pendant un mois reviendrait à moins de 15 cents. Le prix n’est donc généralement pas un facteur qui affecte le choix de l’intervalle d’interrogation.However, at 200,000 transactions for $0.01 (at the time of writing), a single processor polling once every second for a month would cost less than 15 cents so cost is not typically a factor that affects your choice of polling interval.

Pour plus d’informations relatives au coût, consultez Tarification Azure Storage.For up-to-date cost information, see Azure Storage Pricing.

UpdateMessageUpdateMessage

Vous pouvez utiliser l'opération UpdateMessage pour augmenter le délai d'expiration de l'invisibilité ou pour mettre à jour les informations d'état d'un message.You can use UpdateMessage to increase the invisibility timeout or to update state information of a message. Bien que l'opération UpdateMessage soit particulièrement puissante, n'oubliez pas que chacune d'elles est comptabilisée dans le cadre de l'objectif d'évolutivité.While this is powerful, remember that each UpdateMessage operation counts towards the scalability target. Cependant, cela peut constituer une méthode beaucoup plus efficace qu’un flux de travail qui transmet une tâche d’une file d’attente à la suivante, une fois chaque étape terminée.However, this can be a much more efficient approach than having a workflow that passes a job from one queue to the next, as each step of the job is completed. À l’aide de la UpdateMessage opération permet à votre application enregistrer l’état du travail dans le message et puis continuer à travailler, au lieu de requeuing le message pour l’étape suivante de la tâche chaque fois qu’une étape se termine.Using the UpdateMessage operation allows your application to save the job state to the message and then continue working, instead of requeuing the message for the next step of the job every time a step completes.

Pour plus d’informations, consultez l’article Modification du contenu d’un message en file d’attente.For more information, see the article How to: Change the contents of a queued message.

Architecture de l’applicationApplication architecture

Il est conseillé d’utiliser des files d’attente pour rendre l’architecture de votre application extensible.You should use queues to make your application architecture scalable. Vous trouverez, dans les listes suivantes, les méthodes applicables pour accroître l’extensibilité de votre application :The following lists some ways you can use queues to make your application more scalable:

  • Vous pouvez utiliser des files d’attente pour créer des journaux de travaux en souffrance à traiter et éliminer des charges de travail de votre application.You can use queues to create backlogs of work for processing and smooth out workloads in your application. Vous pouvez, par exemple, placer en file d’attente des demandes d’utilisateurs portant sur l’exécution de tâches exigeant d’importantes ressources processeur, telles que le redimensionnement d’images téléchargées.For example, you could queue up requests from users to perform processor intensive work such as resizing uploaded images.
  • Vous pouvez utiliser des files d’attente pour dissocier des parties de votre application, de manière à pouvoir les faire évoluer séparément.You can use queues to decouple parts of your application so that you can scale them independently. Un front-end web peut, par exemple, placer les résultats d’une enquête en file d’attente en vue de les stocker et de les analyser ultérieurement.For example, a web front end could place survey results from users into a queue for later analysis and storage. Vous pouvez ajouter des instances du rôle de travail afin de traiter les données de file d’attente suivant les besoins.You could add more worker role instances to process the queue data as required.

ConclusionConclusion

Dans cet article, nous avons passé en revue quelques-unes des pratiques utilisées le plus couramment pour optimiser les performances lors de l’utilisation d’Azure Storage.This article discussed some of the most common, proven practices for optimizing performance when using Azure Storage. Nous invitons tous les développeurs d’applications à évaluer chacune d’elles et à prendre en compte les recommandations énoncées afin de bénéficier de performances optimales pour les applications qui utilisent Azure Storage.We encourage every application developer to assess their application against each of the above practices and consider acting on the recommendations to get great performance for their applications that use Azure Storage.