Traitement par lots des messages dans une transaction
Les applications en file d'attente utilisent des transactions pour garantir l'exactitude et la remise fiable des messages. Toutefois, les transactions sont des opérations coûteuses et peuvent réduire considérablement le débit de message. L'une des méthodes utilisées pour améliorer le débit de message est de disposer d'une application capable de lire et de traiter plusieurs messages dans une transaction unique. Le compromis réside entre la performance et la récupération : à mesure que le nombre de messages dans un lot augmente, la quantité de travail de récupération nécessaire en cas de restauration des transactions augmente également. Il est important de noter la différence entre le traitement par lots des messages dans une transaction et dans des sessions. Une session est un regroupement de messages du même type traités par une application unique, et validés en tant qu'unité unique. Les sessions sont en général utilisées lorsqu'un groupe de messages du même type doivent être traités ensemble. Un site Web d'achat en ligne en est un exemple. Les lots permettent de traiter plusieurs messages de type différent d'une façon qui augmente le débit de message. Pour plus d'informations sur les sessions, consultez Regroupement de messages mis en file d'attente dans une session. Les messages d'un lot sont également traités par une application unique et sont validés en tant qu'unité unique, mais il peut n'y avoir aucune relation entre eux. Le traitement par lots des messages dans une transaction est une optimisation qui ne modifie pas la manière dont l'application s'exécute.
Passage en mode de traitement par lots
Le comportement de point de terminaison TransactedBatchingBehavior contrôle le traitement par lots. L'ajout de ce comportement de point de terminaison à un point de terminaison de service indique à Windows Communication Foundation (WCF) de traiter par lots les messages dans une transaction. Les messages ne requérant pas tous une transaction, seuls ceux concernés sont placés dans un lot, et seuls ceux envoyés à partir d'opérations marquées avec TransactionScopeRequired = true et TransactionAutoComplete = true sont pris en compte pour un lot. Si toutes les opérations sur le contrat de service sont marquées avec TransactionScopeRequired = false et TransactionAutoComplete = false, le passage en mode de traitement par lots n'a jamais lieu.
Validation d'une transaction
Une transaction par lots est validée selon les éléments suivants :
- MaxBatchSize. Propriété du comportement TransactedBatchingBehavior. Cette propriété détermine le nombre maximal de messages placés dans un lot. Lorsque ce nombre est atteint, le lot est validé. Cette valeur n'est pas une limite stricte et il est possible de valider un lot avant d'avoir reçu ce nombre de messages.
- Transaction Timeout. Lorsque 80 pourcent du délai d'expiration de la transaction est écoulé, le lot est validé et un nouveau lot est créé. Cela signifie que s'il reste 20 pourcent ou moins du temps accordé à une transaction pour se terminer, le lot est validé.
- TransactionScopeRequired. Lors du traitement d'un lot de messages, si WCF en trouve un qui a TransactionScopeRequired = false, il valide le lot et en rouvre un nouveau sur la réception du premier message avec TransactionScopeRequired = true et TransactionAutoComplete = true.
- S'il n'y a plus de message dans la file d'attente, le lot actuel est validé, même si MaxBatchSize n'a pas été atteint ou que 80 pourcent du délai d'expiration de la transaction ne se sont pas écoulés.
Conservation du mode de traitement par lots
Si un message dans un lot provoque l'abandon de la transaction, les étapes suivantes se produisent :
- L'ensemble du lot de messages est restauré.
- Les messages sont lus un par un jusqu'à ce que le nombre de messages lus dépasse le double de la taille de lot maximale.
- Le mode de traitement par lots est réactivé.
Sélection de la taille de lot
La taille d'un lot varie en fonction de l'application. La méthode empirique s'avère être la meilleure pour arriver à une taille de lot optimale pour l'application. Sélectionnez la taille de lot en fonction du modèle de déploiement réel de votre application. Par exemple, lors du déploiement de l'application, si un serveur SQL doit être installé sur un ordinateur distant et qu'une transaction doit couvrir la file d'attente et le serveur SQL, la taille de lot sera déterminée de manière optimale en exécutant cette configuration exacte.
Traitement par lots simultané
Pour augmenter le débit, vous pouvez également exécuter un grand nombre de lots simultanément. Pour activer le traitement par lots simultané, définissez ConcurrencyMode.Multiple dans ServiceBehaviorAttribute.
La limitation de service est un comportement de service permettant d'indiquer le nombre maximal d'appels simultanés qui peuvent être effectués sur le service. Lorsqu'il est utilisé en combinaison avec le traitement par lots, il permet d'indiquer le nombre de lots simultanés qui peuvent être exécutés. Si la limitation de service n'est pas définie, WCF affecte par défaut la valeur 16 au nombre maximal d'appels simultanés. Par conséquent, si le comportement de traitement par lots a été ajouté par défaut, un nombre maximal de 16 lots pourront être actifs simultanément. Il est préférable d'ajuster la limitation de service et le traitement par lots en fonction de votre capacité. Par exemple, si la file d'attente contient 100 messages et qu'un lot de 20 est souhaité, un nombre maximal d'appels simultanés à 16 n'est pas utile car, selon débit, 16 transactions pourraient être actives, ce qui revient au même que de ne pas avoir de traitement par lots activé. Par conséquent, lors de l'optimisation des performances, n'activez pas le traitement par lots simultané ou définissez également une taille de limitation de service correcte.
Traitement par lots et points de terminaison multiples
Un point de terminaison est composé d'une adresse et d'un contrat. Plusieurs points de terminaison peuvent partager la même liaison. Deux points de terminaison peuvent partager la même liaison et écouter un URI (Uniform Resource Identifier) ou une adresse de file d'attente. Si deux points de terminaison lisent à partir de la même file d'attente, et que le comportement de traitement par lots avec transaction est ajouté à ces deux points de terminaison, un conflit dans les tailles de lot spécifiées peut se produire. Il est résolu en implémentant le traitement par lots à l'aide de la taille de lot minimale spécifiée entre les deux comportements de traitement par lots avec transaction. Dans ce scénario, si l'un des points de terminaison ne spécifie pas de traitement par lot avec transaction, les deux points de terminaison ne l'utiliseront pas.
Exemple
L'exemple suivant indique comment spécifier TransactedBatchingBehavior dans un fichier de configuration.
<behaviors>
<endpointBehaviors>
<behavior name="TransactedBatchingBehavior"
maxBatchSize="100"/>
</endpointBehaviors>
</behaviors>
L'exemple suivant indique comment spécifier TransactedBatchingBehavior dans le code.
using (ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService)))
{
ServiceEndpoint sep = ServiceHost.AddServiceEndpoint(typeof(IOrderProcessor), new NetMsmqBinding(), "net.msmq://localhost/private/ServiceModelSamplesTransacted");
sep.Behaviors.Add(new TransactedBatchingBehavior(100));
// Open the ServiceHost to create listeners and start listening for messages.
serviceHost.Open();
// The service can now be accessed.
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostB to shut down the service.
serviceHost.Close();
}
Voir aussi
Concepts
Mise en file d'attente dans WCF