Files d’attente et rubriques partitionnéesPartitioned queues and topics

Azure Service Bus utilise plusieurs courtiers de messages pour traiter les messages et plusieurs banques de messagerie pour stocker les messages.Azure Service Bus employs multiple message brokers to process messages and multiple messaging stores to store messages. Une file d’attente ou une rubrique classique est gérée par un seul courtier de messages et stockée dans une seule banque de messagerie.A conventional queue or topic is handled by a single message broker and stored in one messaging store. Service Bus permet également le partitionnement des files d’attente et des rubriques, ou des entités de messagerie entre plusieurs courtiers de messages et banques de messagerie.Service Bus partitions enable queues and topics, or messaging entities, to be partitioned across multiple message brokers and messaging stores. Le partitionnement signifie que le débit global d’une entité partitionnée n’est plus limité par les performances d’un seul courtier de messages ou d’une seule banque de messagerie.Partitioning means that the overall throughput of a partitioned entity is no longer limited by the performance of a single message broker or messaging store. En outre, la panne temporaire d’une banque de messagerie ne rend pas une rubrique ou une file d’attente partitionnée indisponible.In addition, a temporary outage of a messaging store does not render a partitioned queue or topic unavailable. Les rubriques et les files d’attente partitionnées peuvent contenir toutes les fonctionnalités avancées de Service Bus, comme la prise en charge des transactions et des sessions.Partitioned queues and topics can contain all advanced Service Bus features, such as support for transactions and sessions.

Notes

Le partitionnement est disponible au moment de la création de l’entité pour toutes les files d’attente et rubriques dans les références SKU De base et Standard.Partitioning is available at entity creation for all queues and topics in Basic or Standard SKUs. Il n’est pas disponible pour la référence SKU de messagerie Premium, mais toutes les entités partitionnées déjà existantes dans les espaces de noms Premium continuent de fonctionner comme prévu.It is not available for the Premium messaging SKU, but any previously existing partitioned entities in Premium namespaces continue to work as expected.

Il n’est pas possible de changer l’option de partitionnement dans une file d’attente ou une rubrique existante ; vous pouvez uniquement définir l’option quand vous créez l’entité.It is not possible to change the partitioning option on any existing queue or topic; you can only set the option when you create the entity.

FonctionnementHow it works

Chaque file d’attente partitionnée ou une rubrique se compose de plusieurs partitions.Each partitioned queue or topic consists of multiple partitions. Chaque partition est stockée dans une banque de messagerie différente et gérée par un courtier de messages différents.Each partition is stored in a different messaging store and handled by a different message broker. Lorsqu’un message est envoyé à une file d’attente partitionnée ou une rubrique, Service Bus affecte le message à une des partitions.When a message is sent to a partitioned queue or topic, Service Bus assigns the message to one of the partitions. La sélection est effectuée au hasard par Service Bus ou à l’aide d’une clé de partition que l’expéditeur peut spécifier.The selection is done randomly by Service Bus or by using a partition key that the sender can specify.

Lorsqu’un client souhaite recevoir un message à partir d’une file d’attente partitionnée ou à partir d’un abonnement à une rubrique partitionnée, Service Bus interroge toutes les partitions pour les messages, puis retourne le premier message qui est obtenu à partir des banques de messagerie au destinataire.When a client wants to receive a message from a partitioned queue, or from a subscription to a partitioned topic, Service Bus queries all partitions for messages, then returns the first message that is obtained from any of the messaging stores to the receiver. Service Bus place les autres messages en cache pour les retourner quand il reçoit d'autres requêtes de réception.Service Bus caches the other messages and returns them when it receives additional receive requests. Un client destinataire n’est pas conscient de ce partitionnement ; le comportement côté client d’une file d’attente ou d’une rubrique partitionnée (par exemple, lecture, exécution, report, rebut, préchargement) est identique à celui d’une entité ordinaire.A receiving client is not aware of the partitioning; the client-facing behavior of a partitioned queue or topic (for example, read, complete, defer, deadletter, prefetching) is identical to the behavior of a regular entity.

Il n’existe aucun coût supplémentaire lors de l’envoi d’un message à, ou lors de la réception d’un message depuis, une file d’attente ou une rubrique partitionnée.There is no additional cost when sending a message to, or receiving a message from, a partitioned queue or topic.

Activation du partitionnementEnable partitioning

Pour utiliser des rubriques et des files d’attente partitionnées avec Azure Service Bus, utilisez le Kit de développement logiciel (SDK) Microsoft Azure version 2.2 ou version ultérieure, ou spécifiez api-version=2013-10 ou une version ultérieure dans vos requêtes HTTP.To use partitioned queues and topics with Azure Service Bus, use the Azure SDK version 2.2 or later, or specify api-version=2013-10 or later in your HTTP requests.

standardStandard

Dans le niveau de messagerie Standard, vous pouvez créer des files d’attente et des rubriques Service Bus avec des tailles de 1, 2, 3, 4 ou 5 Go (la valeur par défaut est 1 Go).In the Standard messaging tier, you can create Service Bus queues and topics in 1, 2, 3, 4, or 5-GB sizes (the default is 1 GB). Le partitionnement est activé, Service Bus crée 16 copies (16 partitions) de l’entité, chacun de la même taille spécifiée.With partitioning enabled, Service Bus creates 16 copies (16 partitions) of the entity, each of the same size specified. Par conséquent, si vous créez une file d’attente de 5 Go, avec 16 partitions, la taille maximale de la file d’attente est (5 * 16) = 80 Go.As such, if you create a queue that's 5 GB in size, with 16 partitions the maximum queue size becomes (5 * 16) = 80 GB. Vous pouvez voir la taille maximale de votre file d’attente ou rubrique partitionnée en examinant son entrée sur le portail Azure, dans le panneau Aperçu de cette entité.You can see the maximum size of your partitioned queue or topic by looking at its entry on the Azure portal, in the Overview blade for that entity.

PremiumPremium

Dans un espace de noms de niveau Premium, les entités de partitionnement ne sont pas prises en charge.In a Premium tier namespace, partitioning entities are not supported. Toutefois, vous pouvez quand même créer des files d’attente et des rubriques Service Bus avec des tailles de 1, 2, 3, 4, 5, 10, 20, 40 ou 80 Go (la valeur par défaut est 1 Go).However, you can still create Service Bus queues and topics in 1, 2, 3, 4, 5, 10, 20, 40, or 80-GB sizes (the default is 1 GB). Vous pouvez voir la taille de votre file d’attente ou rubrique en examinant son entrée sur le portail Azure, dans le panneau Aperçu de cette entité.You can see the size of your queue or topic by looking at its entry on the Azure portal, in the Overview blade for that entity.

Créer une entité partitionnéeCreate a partitioned entity

Il existe plusieurs façons de créer une file d’attente ou une rubrique partitionnée.There are several ways to create a partitioned queue or topic. Lorsque vous créez la file d’attente ou la rubrique à partir de votre application, vous pouvez activer le partitionnement de la file d’attente ou de la rubrique en définissant respectivement la propriété QueueDescription.EnablePartitioning ou TopicDescription.EnablePartitioning sur true.When you create the queue or topic from your application, you can enable partitioning for the queue or topic by respectively setting the QueueDescription.EnablePartitioning or TopicDescription.EnablePartitioning property to true. Ces propriétés doivent être définies au moment de la création de la file d’attente ou de la rubrique et sont disponibles uniquement dans l’ancienne bibliothèque WindowsAzure.ServiceBus.These properties must be set at the time the queue or topic is created, and are available only in the older WindowsAzure.ServiceBus library. Comme indiqué précédemment, il n’est pas possible de modifier ces propriétés dans une file d’attente ou une rubrique existante.As stated previously, it is not possible to change these properties on an existing queue or topic. Par exemple : For example:

// Create partitioned topic
NamespaceManager ns = NamespaceManager.CreateFromConnectionString(myConnectionString);
TopicDescription td = new TopicDescription(TopicName);
td.EnablePartitioning = true;
ns.CreateTopic(td);

Vous pouvez également créer une file d’attente ou une rubrique partitionnée sur le portail Azure.Alternatively, you can create a partitioned queue or topic in the Azure portal. Lorsque vous créez une file d’attente ou une rubrique sur le portail, l’option Activer le partitionnement dans la boîte de dialogue Créer de la file d’attente ou de la rubrique est activée par défaut.When you create a queue or topic in the portal, the Enable partitioning option in the queue or topic Create dialog box is checked by default. Vous pouvez uniquement désactiver cette option dans une entité de niveau Standard ; dans le niveau Premium, le partitionnement n’est pas pris en charge et la case à cocher est sans effet.You can only disable this option in a Standard tier entity; in the Premium tier partitioning is not supported, and the checkbox has no effect.

Utilisation de clés de partitionUse of partition keys

Lorsqu’un message est placé dans une file d’attente ou une rubrique partitionnée, Service Bus vérifie la présence d’une clé de partition.When a message is enqueued into a partitioned queue or topic, Service Bus checks for the presence of a partition key. S’il en trouve, il sélectionne la partition basée sur cette clé.If it finds one, it selects the partition based on that key. S’il ne trouve pas une clé de partition, il sélectionne la partition selon un algorithme interne.If it does not find a partition key, it selects the partition based on an internal algorithm.

Utilisation d’une clé de partitionUsing a partition key

Certains scénarios, tels que les sessions ou les transactions, exiger que les messages soient stockés dans une partition spécifique.Some scenarios, such as sessions or transactions, require messages to be stored in a specific partition. Tous ces scénarios requièrent l’utilisation d’une clé de partition.All these scenarios require the use of a partition key. Tous les messages qui utilisent la même clé de partition sont affectés à la même partition.All messages that use the same partition key are assigned to the same partition. Si la partition est temporairement indisponible, Service Bus renvoie une erreur.If the partition is temporarily unavailable, Service Bus returns an error.

Selon le scénario, différentes propriétés de messages sont utilisées comme clé de partition :Depending on the scenario, different message properties are used as a partition key:

SessionId : si un message est configuré par la propriété SessionId, Service Bus utilise SessionID comme clé de partition.SessionId: If a message has the SessionId property set, then Service Bus uses SessionID as the partition key. De cette façon, tous les messages qui appartiennent à la même session sont gérés par le même courtier de messages.This way, all messages that belong to the same session are handled by the same message broker. Les sessions permettent à Service Bus de garantir l’ordre des messages, ainsi que la cohérence des états de session.Sessions enable Service Bus to guarantee message ordering as well as the consistency of session states.

PartitionKey : si un message est configuré avec la propriété PartitionKey mais pas avec la propriété SessionId, Service Bus utilise la valeur de la propriété PartitionKey comme clé de partition.PartitionKey: If a message has the PartitionKey property but not the SessionId property set, then Service Bus uses the PartitionKey property value as the partition key. Si le message a les deux propriétés SessionId et PartitionKey définies, alors elles doivent être identiques.If the message has both the SessionId and the PartitionKey properties set, both properties must be identical. Si la propriété PartitionKey est définie sur une valeur différente de celle de la propriété SessionId, Service Bus retourne une exception d’opération non valide.If the PartitionKey property is set to a different value than the SessionId property, Service Bus returns an invalid operation exception. La propriété PartitionKey doit être utilisée si un expéditeur envoie des messages transactionnels non liés à une session.The PartitionKey property should be used if a sender sends non-session aware transactional messages. La clé de partition garantit que tous les messages qui sont envoyés dans une transaction sont gérés par le même courtier de messages.The partition key ensures that all messages that are sent within a transaction are handled by the same messaging broker.

MessageId : si la file d'attente ou la rubrique est configurée avec la propriété RequiresDuplicateDetection définie sur true et que les propriétés SessionId ou PartitionKey ne sont pas définies, la valeur de la propriété MessageId fait office de clé de partition.MessageId: If the queue or topic has the RequiresDuplicateDetection property set to true and the SessionId or PartitionKey properties are not set, then the MessageId property value serves as the partition key. (Les bibliothèques Microsoft .NET et AMQP attribuent automatiquement un ID de message si l’application émettrice ne le fait pas.) Dans ce cas, toutes les copies du même message sont gérées par le même courtier de messages.(The Microsoft .NET and AMQP libraries automatically assign a message ID if the sending application does not.) In this case, all copies of the same message are handled by the same message broker. Cet ID permet à Service Bus de détecter et d’éliminer les messages en double.This ID enables Service Bus to detect and eliminate duplicate messages. Si la propriété RequiresDuplicateDetection n’est pas définie sur true, Service Bus ne considère pas la propriété MessageId comme clé de partition.If the RequiresDuplicateDetection property is not set to true, Service Bus does not consider the MessageId property as a partition key.

Non utilisation d'une clé de partitionNot using a partition key

En l’absence d’une clé de partition, Service Bus distribue les messages en tourniquet à toutes les partitions de la file d’attente partitionnée ou la rubrique.In the absence of a partition key, Service Bus distributes messages in a round-robin fashion to all the partitions of the partitioned queue or topic. Si la partition choisie n’est pas disponible, Service Bus affecte le message à une autre partition.If the chosen partition is not available, Service Bus assigns the message to a different partition. De cette façon, l'opération d'envoi réussit malgré l'indisponibilité temporaire d'une banque de messagerie.This way, the send operation succeeds despite the temporary unavailability of a messaging store. Cependant, vous obtiendrez pas le classement garanti qui est fourni par une clé de partition.However, you will not achieve the guaranteed ordering that a partition key provides.

Pour une discussion plus approfondie sur le compromis entre la disponibilité (pas de clé de partition) et la cohérence (en utilisant une clé de partition), consultez cet article.For a more in-depth discussion of the tradeoff between availability (no partition key) and consistency (using a partition key), see this article. Ces informations s’appliquent également aux entités Service Bus partitionnées.This information applies equally to partitioned Service Bus entities.

Pour donner à Service Bus assez de temps en file d’attente le message dans une partition différente, le OperationTimeout valeur spécifiée par le client qui envoie le message doit être supérieur à 15 secondes.To give Service Bus enough time to enqueue the message into a different partition, the OperationTimeout value specified by the client that sends the message must be greater than 15 seconds. Il est recommandé de définir la propriété OperationTimeout sur la valeur par défaut de 60 secondes.It is recommended that you set the OperationTimeout property to the default value of 60 seconds.

Une clé de partition « épingle » un message à une partition spécifique.A partition key "pins" a message to a specific partition. Si la banque de messagerie qui détient cette partition n’est pas disponible, Service Bus renvoie une erreur.If the messaging store that holds this partition is unavailable, Service Bus returns an error. En l’absence d’une clé de partition, Service Bus peut choisir une autre partition et l’opération réussit.In the absence of a partition key, Service Bus can choose a different partition and the operation succeeds. Par conséquent, il est recommandé de ne pas fournir de clé de partition, sauf si elle est requise.Therefore, it is recommended that you do not supply a partition key unless it is required.

Rubriques avancées : utiliser des transactions avec des entités partitionnéesAdvanced topics: use transactions with partitioned entities

Les messages envoyés dans le cadre d’une transaction doivent spécifier une clé de partition.Messages that are sent as part of a transaction must specify a partition key. La clé peut être l'une des propriétés suivantes : SessionId, PartitionKey ou MessageId.The key can be one of the following properties: SessionId, PartitionKey, or MessageId. Tous les messages envoyés dans le cadre d'une même transaction doivent spécifier la même clé de partition.All messages that are sent as part of the same transaction must specify the same partition key. Si vous essayez d’envoyer un message sans une clé de partition dans une transaction, Service Bus renvoie une exception d’opération non valide.If you attempt to send a message without a partition key within a transaction, Service Bus returns an invalid operation exception. Si vous essayez d’envoyer plusieurs messages dans la même transaction avec des clés de partition différentes, Service Bus renvoie une exception d’opération non valide.If you attempt to send multiple messages within the same transaction that have different partition keys, Service Bus returns an invalid operation exception. Par exemple : For example:

CommittableTransaction committableTransaction = new CommittableTransaction();
using (TransactionScope ts = new TransactionScope(committableTransaction))
{
    Message msg = new Message("This is a message");
    msg.PartitionKey = "myPartitionKey";
    messageSender.SendAsync(msg); 
    ts.CompleteAsync();
}
committableTransaction.Commit();

Si les propriétés qui servent à une clé de partition sont définies, Service Bus épingle le message à une partition spécifique.If any of the properties that serve as a partition key are set, Service Bus pins the message to a specific partition. Ce comportement se produit qu'une transaction soit utilisée ou non.This behavior occurs whether or not a transaction is used. Il est recommandé de ne pas spécifier de clé de partition si elle n'est pas nécessaire.It is recommended that you do not specify a partition key if it is not necessary.

Utilisation de sessions avec les entités partitionnéesUsing sessions with partitioned entities

Pour envoyer un message transactionnel à une file d’attente ou une rubrique utilisant une session, le message doit contenir la propriété SessionId définie.To send a transactional message to a session-aware topic or queue, the message must have the SessionId property set. Si la propriété PartitionKey est également spécifiée, elle doit être identique à la propriété SessionId.If the PartitionKey property is specified as well, it must be identical to the SessionId property. Si ces propriétés diffèrent, Service Bus renvoie une exception d’opération non valide.If they differ, Service Bus returns an invalid operation exception.

Contrairement aux files d’attente ou rubriques standard (non partitionnées), il n’est pas possible d’utiliser une transaction unique pour envoyer plusieurs messages à différentes sessions.Unlike regular (non-partitioned) queues or topics, it is not possible to use a single transaction to send multiple messages to different sessions. En cas de tentative, Service Bus renvoie une exception d’opération non valide.If attempted, Service Bus returns an invalid operation exception. Par exemple : For example:

CommittableTransaction committableTransaction = new CommittableTransaction();
using (TransactionScope ts = new TransactionScope(committableTransaction))
{
    Message msg = new Message("This is a message");
    msg.SessionId = "mySession";
    messageSender.SendAsync(msg); 
    ts.CompleteAsync();
}
committableTransaction.Commit();

Transfert automatique des messages avec des entités partitionnéesAutomatic message forwarding with partitioned entities

Service Bus prend en charge le transfert automatique des messages à partir de, vers ou entre les entités partitionnées.Service Bus supports automatic message forwarding from, to, or between partitioned entities. Pour activer le transfert automatique des messages, définissez la propriété QueueDescription.ForwardTo de la file d’attente ou de l’abonnement source.To enable automatic message forwarding, set the QueueDescription.ForwardTo property on the source queue or subscription. Si le message spécifie une clé de partition (SessionId, PartitionKey ou MessageId), cette clé de partition est utilisée pour l’entité de destination.If the message specifies a partition key (SessionId, PartitionKey, or MessageId), that partition key is used for the destination entity.

Considérations et recommandationsConsiderations and guidelines

  • Fonctionnalités de cohérence élevée : Si une entité utilise des fonctionnalités telles que les sessions, détection des doublons ou un contrôle explicite de clé de partitionnement, puis les opérations de messagerie sont toujours acheminées vers une partition spécifique.High consistency features: If an entity uses features such as sessions, duplicate detection, or explicit control of partitioning key, then the messaging operations are always routed to specific partition. Si chacune des partitions de rencontrer un trafic élevé ou le magasin sous-jacent n’est pas intègre, ces opérations échouent et la disponibilité est réduite.If any of the partitions experience high traffic or the underlying store is unhealthy, those operations fail and availability is reduced. En général, la cohérence reste plus importante que le nombre d’entités non partitionnées. Seul un sous-ensemble de trafic rencontre des problèmes, et non le trafic tout en entier.Overall, the consistency is still much higher than non-partitioned entities; only a subset of traffic is experiencing issues, as opposed to all the traffic. Pour plus d’informations, consultez cette discussion sur la disponibilité et la cohérence.For more information, see this discussion of availability and consistency.
  • Gestion : Opérations telles que Create, Update et Delete doivent être effectuées sur toutes les partitions de l’entité.Management: Operations such as Create, Update, and Delete must be performed on all the partitions of the entity. Si n’importe quelle partition est défectueuse, cela peut entraîner d’échec de ces opérations.If any partition is unhealthy, it could result in failures for these operations. Pour l’opération d’obtention des informations telles que le nombre de messages doivent être agrégées à partir de toutes les partitions.For the Get operation, information such as message counts must be aggregated from all partitions. Si n’importe quelle partition est défectueuse, l’état de disponibilité d’entité est signalé comme étant limité.If any partition is unhealthy, the entity availability status is reported as limited.
  • Scénarios de messages à faible volume : pour ce type de scénarios, en particulier si vous utilisez le protocole HTTP, vous devrez peut-être effectuer plusieurs opérations de réception afin d'obtenir tous les messages.Low volume message scenarios: For such scenarios, especially when using the HTTP protocol, you may have to perform multiple receive operations in order to obtain all the messages. Pour les demandes de réception, le serveur frontal effectue une opération de réception sur toutes les partitions et met en cache toutes les réponses reçues.For receive requests, the front end performs a receive on all the partitions and caches all the responses received. Une demande de réception ultérieure sur la même connexion profiterait de cette mise en cache et on assisterait à une réduction des latences liées à la réception.A subsequent receive request on the same connection would benefit from this caching and receive latencies will be lower. Toutefois, si vous disposez de plusieurs connexions ou si vous utilisez HTTP, une nouvelle connexion est établie pour chaque demande.However, if you have multiple connections or use HTTP, that establishes a new connection for each request. Par conséquent, l’accès au même nœud n’est pas garanti.As such, there is no guarantee that it would land on the same node. Si tous les messages existants sont verrouillés et mis en cache sur un autre serveur frontal, l’opération de réception renvoie la valeur null.If all existing messages are locked and cached in another front end, the receive operation returns null. Les messages peuvent arriver à expiration et vous pouvez les recevoir à nouveau.Messages eventually expire and you can receive them again. La persistance du protocole HTTP est recommandée.HTTP keep-alive is recommended.
  • Parcourir/Lire furtivement les messages : uniquement disponible dans l'ancienne bibliothèque WindowsAzure.ServiceBus.Browse/Peek messages: Available only in the older WindowsAzure.ServiceBus library. PeekBatch ne retourne pas toujours le nombre de messages spécifié dans la propriété MessageCount.PeekBatch does not always return the number of messages specified in the MessageCount property. Il existe deux raisons courantes à ce comportement.There are two common reasons for this behavior. L’une des raisons est que la taille agrégée de la collection de messages dépasse la taille maximale de 256 ko.One reason is that the aggregated size of the collection of messages exceeds the maximum size of 256 KB. Une autre raison est que si la propriété EnablePartitioning de la file d’attente ou de la rubrique est définie sur true, il se peut qu’une partition ne dispose pas de suffisamment de messages pour terminer le nombre de messages demandé.Another reason is that if the queue or topic has the EnablePartitioning property set to true, a partition may not have enough messages to complete the requested number of messages. En règle générale, si une application veut recevoir un certain nombre de messages, elle doit appeler PeekBatch à plusieurs reprises jusqu’à obtenir le nombre de messages voulu à moins qu’il n’y ait plus de messages pour lesquels afficher un aperçu.In general, if an application wants to receive a specific number of messages, it should call PeekBatch repeatedly until it gets that number of messages, or there are no more messages to peek. Pour plus d’informations, y compris pour obtenir des exemples de code, consultez la documentation d’API QueueClient.PeekBatch ou SubscriptionClient.PeekBatch.For more information, including code samples, see the QueueClient.PeekBatch or SubscriptionClient.PeekBatch API documentation.

Dernières fonctionnalités ajoutéesLatest added features

Limites des entités partitionnéesPartitioned entities limitations

Actuellement, Service Bus impose les limites suivantes aux files d’attente et rubriques partitionnées :Currently Service Bus imposes the following limitations on partitioned queues and topics:

  • Les files d’attente et les rubriques partitionnées ne sont pas prises en charge dans le niveau de messagerie Premium.Partitioned queues and topics are not supported in the Premium messaging tier. Les sessions sont prises en charge dans le premier niveau à l’aide de SessionId.Sessions are supported in the premier tier by using SessionId.
  • Les rubriques et files d’attente partitionnées ne prennent pas en charge l’envoi de messages appartenant à des sessions différentes dans une transaction unique.Partitioned queues and topics do not support sending messages that belong to different sessions in a single transaction.
  • Service Bus permet actuellement de disposer jusqu’à 100 rubriques ou files d’attente par espace de noms.Service Bus currently allows up to 100 partitioned queues or topics per namespace. Chaque file d’attente ou rubrique partitionnée est comptabilisée dans le quota de 10 000 entités par espace de noms (non applicable au niveau Premium).Each partitioned queue or topic counts towards the quota of 10,000 entities per namespace (does not apply to Premium tier).

Étapes suivantesNext steps

Pour en savoir plus sur les concepts fondamentaux de la spécification de la messagerie AMQP 1.0, consultez le Guide du protocole AMQP 1.0.Read about the core concepts of the AMQP 1.0 messaging specification in the AMQP 1.0 protocol guide.