2017-08-09 2 views
0

Je souhaite m'assurer que mes messages sont distribués uniformément entre les partitions du bus de service. Nous avons actuellement des messages qui sont envoyés avec un sessionId défini sur id.ToString() où Id est un entier. Cependant, je me demande si cela suffirait à bien distribuer les messages. Pour autant que je sache, il n'y a aucun moyen de confirmer comment les sessions sont distribuées, donc pas moyen de tester cela.Qu'est-ce que l'algorithme de routage des messages de partition dans le bus de service azure

Je peux voir dans cet exemple que Ids session sont préfixés par « session » https://github.com/Azure/azure-service-bus/tree/master/samples/DotNet/Microsoft.Azure.ServiceBus/BasicSessionSendReceiveUsingQueueClient

Est-ce quelque chose à ma question pure coïncidence? Ou est-ce quelque chose que je devrais faire Si mon sessionId sera dérivé d'un entier? Le problème ici est que si le bus de service utilise un schéma de partitionnement à distance tel que celui du fabric de service, les valeurs entières proches les unes des autres seront placées sur la même partition.

EDIT: pour être précis, cette question consiste à s'assurer que les messages sont distribués uniformément sur les partitions du bus de service (pas d'équilibrage de charge des consommateurs) - J'ai mis à jour la question pour mieux refléter cela.

Merci,

+0

Le préfixe utilisé dans l'échantillon peut être n'importe quelle valeur autre que "session". L'ID de session est utilisé pour identifier une session. En termes de distribution de la charge, le nombre de sessions simultanées multipliées par le nombre de nœuds de traitement est ce qui va prendre les sessions. Le reste est des consommateurs concurrents, je suppose. –

+0

Merci @SeanFeldman - ma question se rapporte spécifiquement à la distribution des messages à travers les partitions dans le bus de service .. pas la distribution des sessions à travers les consommateurs. Je pense que cela peut être appliqué plus généralement à l'utilisation de PartitionKey. –

Répondre

0

Comme What are partitioned queues and topics? expliqué comme suit:

En un mot, une file d'attente partitionné ou travaux de sujet comme suit: Chaque file d'attente cloisonné ou sujet est constitué de plusieurs fragments. Chaque fragment est stocké dans un magasin de messagerie différent et traité par un courtier de messages différent. Lorsqu'un message est envoyé à une file d'attente ou un sujet partitionné, Service Bus affecte le message à l'un des fragments. La sélection est effectuée de manière aléatoire par Service Bus ou par une clé de partition qui peut être spécifiée par l'expéditeur.

Lorsqu'un message est dans une file d'attente en file d'attente partitionnée ou sujet, chèques Service Bus pour la présence d'une partition clé. S'il en trouve un, il sélectionne le fragment basé sur cette clé. Si ce n'est pas le cas, il sélectionne le fragment basé sur un algorithme interne. Utilisation d'une clé de partition Certains scénarios, tels que sessions ou transactions, nécessitent que les messages soient stockés dans un certain fragment. Tous ces scénarios nécessitent l'utilisation d'une clé de partition. Tous les messages qui utilisent la même clé de partition sont affectés au même fragment. Selon le scénario, différentes propriétés de message sont utilisées comme clé de partition.

Pour le scénario des sessions, il se lit comme suit:

Si un message a l'ensemble de la propriété SessionId, puis Service Bus utilise la propriété SessionId comme la partition clé. De cette façon, tous les messages appartenant à la même session sont affectés au même fragment et gérés par le même courtier. Cela permet à Service Bus de garantir l'ordre des messages ainsi que la cohérence des états de session.

De plus, si vous ne spécifiez pas de propriétés de message (SessionId ou PartitionKey ou MessageId) qui serait utilisé comme une clé de partition, Service Bus distribue des messages de manière ronde à tous les fragments du cloisonné file d'attente ou sujet. Si le fragment choisi n'est pas disponible, Service Bus affecte le message à un fragment différent.

Pour plus de détails, vous pouvez vous référer à Partitioned Service Bus Queues and Topics.

+0

Merci pour votre commentaire bruce. J'ai versé sur cet article plusieurs fois. Ce qui manque, c'est l'explication de la façon dont il "sélectionne le fragment basé sur cette clé". Par exemple, il pourrait utiliser une opération modulo. Ou il pourrait utiliser une partition à distance ... Je suis sûr qu'il y en a beaucoup ... mais qu'utilise AzureServiceBus? –

+0

J'ai vérifié que l'algorithme de sélection du fragment basé sur cette clé n'est pas documenté. Si vous voulez savoir comment le bus de service azure l'a implémenté, vous pouvez ajouter votre commentaire sous [Files d'attente et rubriques partitionnées] (https://docs.microsoft.com/en-us/azure/service-bus-messaging/service- bus-partitioning) ou ajoutez vos commentaires [ici] (https://feedback.azure.com/forums/216926-service-bus). –

+0

Commentaires meilleurs à fournir à [GitHub issue tracker] (https://github.com/Azure/azure-service-bus/issues), sous l'étiquette 'documentation'. –