Batchverarbeitung von Nachrichten in einer TransaktionBatching Messages in a Transaction

Anwendungen, die mit Warteschlangen arbeiten, verwenden Transaktionen, um eine richtige und zuverlässige Zustellung der Nachrichten zu gewährleisten.Queued applications use transactions to ensure correctness and reliable delivery of messages. Transaktionen sind jedoch teuer und können den Nachrichtendurchsatz stark senken.Transactions, however, are expensive operations and can dramatically reduce message throughput. Eine Möglichkeit, den Nachrichtendurchsatz zu verbessern, ist, dass mehrere Nachrichten in einer Transaktion von einer Anwendung gelesen und verarbeitet werden.One way to improve message throughput is to have an application read and process multiple messages within a single transaction. Dabei muss zwischen Leistung und Wiederherstellungsaufwand abgewogen werden: Je mehr Nachrichten sich in einem Batch befinden, desto umfangreicher ist die Wiederherstellungsarbeit, die anfällt, falls Transaktionen zurückgesetzt werden.The trade-off is between performance and recovery: as the number of messages in a batch increases, so does the amount of recovery work that required if transactions are rolled back. Beachten Sie dabei den Unterschied zwischen der Batchverarbeitung von Nachrichten in einer Transaktion und in Sitzungen.It is important to note the difference between batching messages in a transaction and sessions. Ein Sitzung ist eine Gruppierung verwandter Nachrichten, die von einer einzigen Anwendung verarbeitet werden und als einzelne Einheit ein Commit.A session is a grouping of related messages that are processed by a single application and committed as a single unit. Sitzungen werden in der Regel verwendet, wenn eine Gruppe verwandter Nachrichten gemeinsam verarbeitet werden muss.Sessions are generally used when a group of related messages must be processed together. Ein Beispiel hierfür ist eine Website für Online-Shopping.An example of this is an online shopping Web site. Batches werden verwendet, um die Verarbeitung mehrerer, unzusammenhängender Nachrichten so, dass Nachrichtendurchsatz zu erhöhen.Batches are used to process multiple, unrelated messages in a way that increases message throughput. Weitere Informationen zu Sitzungen finden Sie unter Gruppierung in der Warteschlange Nachrichten in einer Sitzung.For more information about sessions, see Grouping Queued Messages in a Session. Nachrichten in einem Batch werden auch nur von einer Anwendung verarbeitet und als Einheit festgeschrieben (COMMIT), die Nachrichten im Batch stehen jedoch ggf. in keinem Zusammenhang zueinander.Messages in a batch are also processed by a single application and committed as a single unit, but there may be no relationship between the messages in the batch. Die Batchverarbeitung von Nachrichten in einer Transaktion ist eine Optimierung, die sich nicht auf die Ausführung der Anwendung auswirkt.Batching messages in a transaction is an optimization that does not change how the application runs.

Aktivieren des BatchmodusEntering Batching Mode

Die Batchverarbeitung wird durch das TransactedBatchingBehavior-Endpunktverhalten gesteuert.The TransactedBatchingBehavior endpoint behavior controls batching. Zu einem Dienstendpunkt dieses Endpunktverhalten hinzufügen, weist Windows Communication Foundation (WCF) zum von batchnachrichten in einer Transaktion.Adding this endpoint behavior to a service endpoint tells Windows Communication Foundation (WCF) to batch messages in a transaction. Nicht alle Nachrichten erfordern eine Transaktion nur Nachrichten, die eine Transaktion müssen in einem Batch platziert werden, und nur Nachrichten von Vorgängen mit markierten TransactionScopeRequired = true und TransactionAutoComplete = true sind für einen Batch berücksichtigt.Not all messages require a transaction, so only messages that require a transaction are placed in a batch, and only messages sent from operations marked with TransactionScopeRequired = true and TransactionAutoComplete = true are considered for a batch. Wenn alle Vorgänge im Dienstvertrag mit gekennzeichnet sind TransactionScopeRequired = false und TransactionAutoComplete = false, und klicken Sie dann Batchmodus nie ist.If all operations on the service contract are marked with TransactionScopeRequired = false and TransactionAutoComplete = false, then batching mode is never entered.

Durchführen eines Commits für eine TransaktionCommitting a Transaction

Bei Batchtransaktionen werden Commits auf Grundlage der folgenden Punkte durchgeführt:A batched transaction is committed based on the following:

  • MaxBatchSizeMaxBatchSize. Eine Eigenschaft des TransactedBatchingBehavior-Verhaltens.A property of the TransactedBatchingBehavior behavior. Durch diese Eigenschaft wird die maximale Anzahl von Nachrichten in einen Batch bestimmt.This property determines the maximum number of messages that are placed into a batch. Sobald diese Anzahl erreicht ist, wird ein Commit für den Batch durchgeführt.When this number is reached, the batch is committed. Es handelt sich bei diesem Wert allerdings um einen flexiblen Grenzwert, das heißt, dass für einen Batch auch schon vor Erreichen dieser Anzahl von Nachrichten ein Commit durchgeführt werden kann.This is value is not a strict limit, it is possible to commit a batch before receiving this number of messages.

  • Transaction TimeoutTransaction Timeout. Sobald 80 Prozent des Transaktionstimeouts verstrichen sind, wird ein Commit für den Batch durchgeführt und ein neuer Batch erstellt.After 80 percent of the transaction's time-out has elapsed, the batch is committed and a new batch is created. Das heißt, dass der Commit für den Batch durchgeführt wird, sobald nur noch maximal 20 Prozent der für die Transaktion erlaubten Zeit übrig sind.This means that if 20 percent or less of the time given for a transaction to complete remains, the batch is committed.

  • TransactionScopeRequiredTransactionScopeRequired. Bei der Verarbeitung eines Nachrichtenbatches, wenn WCF eine findet, die TransactionScopeRequired = false, er führt einen Commit für den Batch und ein neuer Batch nach dem Empfang der ersten Nachricht mit eröffnet TransactionScopeRequired = true und TransactionAutoComplete = true.When processing a batch of messages, if WCF finds one that has TransactionScopeRequired = false, it commits the batch and reopens a new batch on receipt of the first message with TransactionScopeRequired = true and TransactionAutoComplete = true.

  • Falls die Warteschlange keine weiteren Nachrichten mehr enthält, wird ein Commit für den aktuellen Batch durchgeführt, selbst wenn MaxBatchSize noch nicht erreicht wurde bzw. noch keine 80 Prozent des Transaktionstimeouts verstrichen sind.If no more messages exist in the queue, then the current batch is committed, even if the MaxBatchSize has not been reached or 80 percent of the transaction's time-out has not elapsed.

Deaktivieren des BatchmodusLeaving Batching Mode

Falls die Transaktion durch eine Nachricht in einem Batch abgebrochen wird, werden die folgenden Schritte durchlaufen:If a message in a batch causes the transaction to abort, the following steps occur:

  1. Der gesamte Nachrichtenbatch wird zurückgesetzt.The entire batch of messages is rolled back.

  2. Die Nachrichten werden solange einzeln nacheinander gelesen, bis die Anzahl der gelesenen Nachrichten die doppelte maximale Batchgröße überschritten hat.Messages are read one at a time until the number of messages read exceeds twice the maximum batch size.

  3. Der Batchmodus wird wieder aufgenommen.Batch mode is re-entered.

Auswählen der BatchgrößeChoosing the Batch Size

Die Größe eines Batches ist abhängig von der Anwendung.The size of a batch is application-dependent. Mit einem empirischen Vorgehen lässt sich die optimale Batchgröße für die Anwendung am besten bestimmen.The empirical method is the best way to arrive at an optimal batch size for the application. Wählen Sie die Batchgröße immer entsprechend dem tatsächlichen Bereitstellungsmodell Ihrer Anwendung.It is important to remember when choosing a batch size to choose the size according to your application's actual deployment model. Wenn beispielsweise bei der Bereitstellung der Anwendung ein SQL-Server auf einem Remotecomputer und eine Transaktion als Brücke zwischen Warteschlange und SQL-Server erforderlich sind, lässt sich die Batchgröße am besten durch Ausführen genau dieser Konfiguration ermitteln.For example, when deploying the application, if you need an SQL server on a remote machine and a transaction that spans the queue and the SQL server, then the batch size is best determined by running this exact configuration.

Parallelität und BatchverarbeitungConcurrency and Batching

Um den Durchsatz zu erhöhen, können auch viele Batches gleichzeitig ausgeführt werden.To increase throughput, you can also have many batches run concurrently. Die parallele Batchverarbeitung wird aktiviert, indem Sie ConcurrencyMode.Multiple auf ServiceBehaviorAttribute setzen.By setting ConcurrencyMode.Multiple in ServiceBehaviorAttribute, you enable concurrent batching.

Diensteinschränkung ist ein Dienstverhalten, die verwendet wird, um anzugeben, wie viele parallele Aufrufe maximal für den Dienst durchgeführt werden können.Service throttling is a service behavior that is used to indicate how many maximum concurrent calls can be made on the service. Im Zusammenhang mit der Batchverarbeitung legt dieses Verhalten fest, wie viele Batches gleichzeitig ausgeführt werden dürfen.When used with batching, this is interpreted as how many concurrent batches can be run. Wenn die diensteinschränkung nicht festgelegt ist, wird standardmäßig WCF die maximale Anzahl gleichzeitiger Aufrufe auf 16.If the service throttling is not set, WCF defaults the maximum concurrent calls to 16. Wird zudem standardmäßig noch das Batchverarbeitungsverhalten hinzugefügt, bedeutet dies, dass maximal 16 Batches gleichzeitig aktiv sein können.Thus, if batching behavior were added by default, a maximum of 16 batches can be active at the same time. Optimieren Sie die Diensteinschränkung und die Batchverarbeitung möglichst auf Grundlage Ihrer Kapazitäten.It is best to tune the service throttling and batching based on your capacity. Wenn die Warteschlange beispielsweise 100 Nachrichten enthält und ein Batch 20 Nachrichten umfassen soll, ist es nicht sinnvoll, maximal 16 parallele Aufrufe festzulegen, da in diesem Fall je nach Durchsatz 16 Transaktion aktiv sein können, was einer Deaktivierung der Batchverarbeitung gleichkommen würde.For example, if the queue has 100 messages and a batch of 20 is desired, having the maximum concurrent calls set to 16 is not useful because, depending on throughput, 16 transactions could be active, similar to not having batching turned on. Um eine optimale Leistung zu erzielen, müssen Sie daher entweder die parallele Batchverarbeitung deaktivieren oder bei aktivierter paralleler Verarbeitung die richtige Größe für die Diensteinschränkung auswählen.Therefore, when fine-tuning for performance, either do not have concurrent batching or have concurrent batching with the correct service throttle size.

Batchverarbeitung und mehrere EndpunkteBatching and Multiple Endpoints

Ein Endpunkt besteht aus einer Adresse und einem Vertrag.An endpoint is composed of an address and a contract. Mehrere Endpunkte können die gleiche Bindung verwenden.There may be multiple endpoints that share the same binding. Zwei Endpunkte können die gleiche Bindung und den gleichen Abhör-URI (Uniform Resource Identifier) bzw. die gleiche Warteschlangenadresse verwenden.It is possible for two endpoints to share the same binding and listen Uniform Resource Identifier (URI), or queue address. Falls zwei Endpunkte aus derselben Warteschlange lesen und für beide Endpunkte wird transaktives Batchverarbeitungsverhalten hinzugefügt, kann es zu einem Konflikt zwischen den angegebenen Batchgrößen kommen.If two endpoints are reading from the same queue, and transacted batching behavior is added to both endpoints, a conflict in the batch sizes specified could arise. Dieser Konflikt lässt sich lösen, indem die Batchverarbeitung mit der kleinsten zwischen den beiden transaktiven Batchverarbeitungsverhalten angegebenen Batchgröße implementiert wird.This is resolved by implementing batching using the minimal batch size specified between the two transacted batching behaviors. In diesem Szenario wird an keinem Endpunkt eine Batchverarbeitung durchgeführt, wenn für einen Endpunkt keine transaktive Batchverarbeitung angegeben wird.In this scenario, if one of the endpoints does not specify transacted batching, then both endpoints would not use batching.

BeispielExample

Im folgenden Beispiel wird gezeigt, wie Sie TransactedBatchingBehavior in einer Konfigurationsdatei angeben können.The following example shows how to specify the TransactedBatchingBehavior in a configuration file.

<behaviors>
  <endpointBehaviors>
    <behavior name="TransactedBatchingBehavior"
              maxBatchSize="100" />
  </endpointBehaviors>
</behaviors>

Im folgenden Beispiel wird gezeigt, wie Sie TransactedBatchingBehavior im Code angeben können.The following example shows how to specify the TransactedBatchingBehavior in 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();
}  

Siehe auchSee Also

WarteschlangenübersichtQueues Overview
Queuing in WCFQueuing in WCF