Bewährte Methoden für die Kommunikation unter Verwendung von WarteschlangenBest Practices for Queued Communication

Dieses Thema enthält empfohlene Vorgehensweisen für die warteschlangenkommunikation in Windows Communication Foundation (WCF).This topic provides recommended practices for queued communication in Windows Communication Foundation (WCF). In den folgenden Abschnitten werden bewährte Methoden aus der Perspektive eines Szenarios vorgestellt.The following sections discuss recommended practices from a scenario perspective.

Schnelles Warteschlangen-Messaging nach dem Best-Effort-PrinzipFast, Best-Effort Queued Messaging

Falls Sie die Vorzüge der Nachrichtentrennung beim Warteschlangen-Messaging nutzen möchten und auf einen schnellen, leistungsfähigen Nachrichtenaustausch mit einer Best-Effort-Zusicherung angewiesen sind, verwenden Sie eine Warteschlange, bei der es sich nicht um eine Transaktionswarteschlange handelt, und legen Sie die ExactlyOnce-Eigenschaft auf false fest.For scenarios that require separation that queued messaging provides and fast, high-performance messaging with best-effort assurances, use a non-transactional queue and set the ExactlyOnce property to false.

Darüber hinaus können Sie die Durable-Eigenschaft auf false festlegen, um die Kosten, die beim Schreiben auf einen Datenträger entstehen, zu umgehen.In addition, you can choose not to incur the cost of disk writes by setting the Durable property to false.

Die Sicherheit wirkt sich auf die Leistung aus.Security has implications on performance. Weitere Informationen finden Sie unter Leistungsaspekte.For more information, see Performance Considerations.

Zuverlässiges End-to-End-Warteschlangen-MessagingReliable End-to-End Queued Messaging

In den folgenden Abschnitten werden bewährte Methoden für Szenarien beschrieben, in denen ein zuverlässiges End-to-End-Messaging erforderlich ist.The following sections describe recommended practices for scenarios that require end-to-end reliable messaging.

Grundlegende zuverlässige ÜbertragungBasic Reliable Transfer

Um eine zuverlässige End-to-End-Übertragung zu gewährleisten, legen Sie die ExactlyOnce-Eigenschaft auf den Wert true festFor end-to-end reliability, set the ExactlyOnce property to true to ensure transfer. Die Durable-Eigenschaft kann je nach Bedarf auf true oder false festgelegt werden. (Die Standardeinstellung ist true.)The Durable property can be set to true or false depending on your requirements (the default is true). Im Allgemeinen wird für die Durable-Eigenschaft der Wert true gewählt, wenn eine zuverlässige End-to-End-Übertragung gewünscht wird.Generally, the Durable property is set to true as part of end-to-end reliability. Dies geht zwar auf Kosten der Leistung, Meldungen gehen bei dieser Einstellung jedoch nicht verloren, falls ein Warteschlangen-Manager einmal abstürzen sollte.The compromise is a performance cost, but makes the message durable so that the message is not lost if a queue manager crashes.

Verwendung von TransaktionenUse of Transactions

Sie müssen Transaktionen verwenden, um eine zuverlässige End-to-End-Übertragung zu gewährleisten.You must use transactions to ensure end-to-end reliability. ExactlyOnce-Zusicherungen gewährleisten nur, dass Nachrichten an die Zielwarteschlange gesendet werden.ExactlyOnce assurances only ensure that messages are delivered to the target queue. Um sicherzustellen, dass die Nachricht auch empfangen wird, verwenden Sie Transaktionen.To ensure that the message is received, use transactions. Ohne Transaktionen geht bei einem Absturz des Diensts die gerade zugestellte Nachricht verloren, wobei sie jedoch an die Anwendung gesendet wird.Without transactions, if the service crashes, you lose the message that is being delivered but is actually delivered to the application.

Verwendung von Warteschlangen für unzustellbare NachrichtenUse of Dead-letter Queues

Bei Verwendung von Warteschlangen für unzustellbare Nachrichten werden Sie benachrichtigt, falls eine Nachricht nicht in die Zielwarteschlange gestellt werden kann.Dead-letter queues ensure that you are notified if a message fails to be delivered to the target queue. Sie können die vom System bereitgestellte oder Ihre eigene Warteschlange für unzustellbare Nachrichten verwenden.You can use the system-provided dead-letter queue or a custom dead-letter queue. Im Allgemeinen empfiehlt sich die Verwendung Ihrer eigenen Warteschlange für unzustellbare Nachrichten, da Sie die nicht zustellbaren Nachrichten einer Anwendung dann an eine bestimmte Warteschlange für unzustellbare Nachrichten senden können.In general, using a custom dead-letter queue is best because it enables you to send dead-letter messages from one application into a single dead-letter queue. Andernfalls werden alle nicht zustellbaren Nachrichten aller Anwendungen auf dem System in eine einzige Warteschlange gestellt.Otherwise, all dead-letter messages that occur for all applications running on the system are delivered to a single queue. In diesem Fall muss dann jede Anwendung in der Warteschlange für unzustellbare Nachrichten nach den für sie relevanten unzustellbaren Nachrichten suchen.Each application must then search though the dead-letter queue to find the dead-letter messages that are relevant to that application. Gelegentlich können keine benutzerdefinierten Warteschlangen für unzustellbare Nachrichten verwendet werden, zum Beispiel bei MSMQ 3.0.Sometimes, using a custom dead-letter queue is not feasible, such as when using MSMQ 3.0.

Es wird davon abgeraten, Warteschlangen für unzustellbare Nachrichten für eine zuverlässige End-to-End-Kommunikation zu deaktivieren.Turning off dead-letter queues for end-to-end reliable communication is not recommended.

Weitere Informationen finden Sie unter behandeln übertragen Nachrichtenfehlern unzustellbare Warteschlangen mithilfe von.For more information, see Using Dead-Letter Queues to Handle Message Transfer Failures.

Handhabung beschädigter (nicht verarbeitbarer) NachrichtenUse of Poison-Message Handling

Die Handhabung beschädigter Nachrichten gibt Ihnen die Möglichkeit zur Wiederherstellung nach Fehlern bei der Nachrichtenverarbeitung.Poison-message handling provides the ability to recover from the failure to process messages.

Wenn Sie die Funktion für die Handhabung beschädigter Nachrichten verwenden, muss die ReceiveErrorHandling-Eigenschaft auf den richtigen Wert festgelegt werden.When using the poison-message handling feature, ensure that the ReceiveErrorHandling property is set to the appropriate value. Bei Drop gehen die Daten verloren.Setting it to Drop means the data is lost. Andererseits wird bei der Einstellung Fault auf dem Diensthost ein Fehler ausgegeben, wenn dieser auf eine beschädigte (nicht verarbeitbare) Nachricht stößt.On the other hand, setting it to Fault faults the service host when it detects a poison message. Bei MSMQ 3.0 ist die Einstellung Fault die beste Option, um Datenverluste zu vermeiden und die beschädigte Nachricht zu eliminieren.Using MSMQ 3.0, Fault is the best option to avoid data loss and move the poison message out of the way. Bei Verwendung von MSMQ 4.0 ist Move die empfohlene Vorgehensweise.Using MSMQ 4.0, Move is the recommended approach. Durch Move wird die kritische Nachricht aus der Warteschlange verschoben, sodass neue Nachrichten verarbeitet werden können.Move moves a poisoned message out of the queue so the service can continue to process new messages. Die beschädigte Nachricht kann dann separat vom Dienst für beschädigte Nachrichten verarbeitet werden.The poison-message service can then process the poison message separately.

Weitere Informationen finden Sie unter Behandlung nicht verarbeitbarer Nachrichten.For more information, see Poison Message Handling.

Hoher DurchsatzAchieving High Throughput

Verwenden Sie Folgendes, um bei einem einzelnen Endpunkt einen hohen Durchsatz zu erreichen:To achieve high throughput on a single endpoint, use the following:

  • Transaktive Batchverarbeitung:Transacted batching. Bei der transaktiven Batchverarbeitung ist sichergestellt, dass viele Nachrichten in einer einzelnen Transaktion gelesen werden können.Transacted batching ensures that many messages can be read in a single transaction. Hierdurch werden die Commits für Transaktionen optimiert und die Gesamtleistung verbessert.This optimizes transaction commits, increasing overall performance. Nachteil der Batchverarbeitung: Tritt bei einer Nachricht im Batch ein Fehler auf, wird der gesamte Batch zurückgesetzt, und die Nachrichten müssen so lange einzeln verarbeitet werden, bis die Batchverarbeitung wieder sicher aufgenommen werden kann.The cost of batching is that if a failure occurs in a single message within a batch, then the entire batch is rolled back and the messages must be processed one at a time until it is safe to batch again. Da beschädigte Nachrichten in der Regel nur selten auftreten, ist die Batchverarbeitung die bevorzugte Methode, die Systemleistung zu verbessern, insbesondere dann, wenn noch andere Ressourcen-Manager an der Transaktion beteiligt sind.In most cases, poison messages are rare, so batching is the preferred way to increase system performance, particularly when you have other resource managers that participate in the transaction. Weitere Informationen finden Sie unter Batchverarbeitung von Nachrichten in einer Transaktion.For more information, see Batching Messages in a Transaction.

  • Parallelität:Concurrency. Parallelität erhöht den Durchsatz, verschärft jedoch auch den Wettstreit um freigegebene Ressourcen.Concurrency increases throughput, but concurrency also affects contention to shared resources. Weitere Informationen finden Sie unter Parallelität.For more information, see Concurrency.

  • Einschränkung:Throttling. Schränken Sie die Anzahl der Nachrichten in der Verteilerpipeline ein, um eine optimale Leistung zu erzielen.For optimal performance, throttle the number of messages in the dispatcher pipeline. Ein Beispiel hierzu finden Sie unter Einschränkung.For an example of how to do this, see Throttling.

Beachten Sie bei der Batchverarbeitung, dass Parallelität und Einschränkung zu simultanen Batches führen.When using batching, be aware that concurrency and throttling translate to concurrent batches.

Um höheren Durchsatz und Verfügbarkeit zu erreichen, verwenden Sie eine Farm von WCF-Diensten, die aus der Warteschlange gelesen.To achieve higher throughput and availability, use a farm of WCF services that read from the queue. Hierfür müssen diese Dienste denselben Vertrag auf demselben Endpunkt verfügbar machen.This requires that all of these services expose the same contract on the same endpoint. Eine Dienstefarm ist am besten bei Anwendungen geeignet, die sehr viele Nachrichten produzieren, da dann mehrere Dienste aus derselben Warteschlange lesen können.The farm approach works best for applications that have high production rates of messages because it enables a number of services to all read from the same queue.

Beachten Sie bei der Verwendung von Farmen, dass MSMQ 3.0 keine remote durchgeführten Lesevorgänge unterstützt.When using farms, be aware that MSMQ 3.0 does not support remote transacted reads. MSMQ 4.0 dagegen unterstützt remote durchgeführte Lesevorgänge.MSMQ 4.0 does support remote transacted reads.

Weitere Informationen finden Sie unter Batchverarbeitung von Nachrichten in einer Transaktion und Unterschiede in Queuing-Funktionen in Windows Vista, Windows Server 2003 und Windows XP.For more information, see Batching Messages in a Transaction and Differences in Queuing Features in Windows Vista, Windows Server 2003, and Windows XP.

Warteschlangen und ArbeitseinheitssemantikQueuing with Unit of Work Semantics

Gelegentlich können die Nachrichten in einer Gruppe von Nachrichten in der Warteschlange miteinander verwandt sein, das heißt, dass die Reihenfolge dieser Nachrichten von Bedeutung ist.In some scenarios a group of messages in a queue may be related and, therefore, the ordering of these messages is significant. In diesen Szenarien sollte die Gruppe der verwandten Nachrichten als Einheit verarbeitet werden, das heißt, es werden entweder alle oder keine Nachrichten verarbeitet.In such scenarios, process a group of related messages together as a single unit: either all of the messages are processed successfully or none are. Verwenden Sie zur Implementierung dieses Verhaltens Sitzungen mit Warteschlangen.To implement such behavior, use sessions with queues.

Weitere Informationen finden Sie unter Gruppierung in der Warteschlange Nachrichten in einer Sitzung.For more information, see Grouping Queued Messages in a Session.

Korrelieren von Anforderung-Antwort-NachrichtenCorrelating Request-Reply Messages

Warteschlangen sind zwar im Allgemeinen unidirektional, es kann jedoch vorkommen, dass Sie eine empfangene Antwort zu einer zuvor gesendeten Anforderung in Bezug setzen möchten.Though queues are typically one-way, in some scenarios you may want to correlate a reply received to a request sent earlier. Falls eine solche Zuordnung erforderlich ist, sollten Sie, wenn möglich, mit der Nachricht Ihren eigenen SOAP-Nachrichtenheader mit Zuordnungsinformationen verwenden.If you require such correlation, it is recommended that you apply your own SOAP message header that contains correlation information with the message. In der Regel wird dieser Header vom Sender an die Nachricht angehängt. Beim Empfänger wird der Nachrichtenheader mit den Zuordnungsinformationen dann während der Verarbeitung der Nachricht an die Antwortnachricht, die als neue Nachricht an eine Antwortwarteschlange gesendet wird, angehängt, sodass die Antwortnachricht beim Sender der Anforderungsnachricht zugeordnet werden kann.Typically, the sender attaches this header with the message, and the receiver, upon processing the message and replying back with a new message on a reply queue, attaches the sender's message header that contains the correlation information so that the sender can identify the reply message with the request message.

Integrieren von Nicht-WCF-AnwendungenIntegrating with Non-WCF Applications

Verwendung MsmqIntegrationBinding beim WCF-Dienste oder Clients mit nicht-WCF-Dienste oder Clients zu integrieren.Use MsmqIntegrationBinding when integrating WCF services or clients with non-WCF services or clients. Die nicht-WCF-Anwendung kann eine mit System.Messaging, COM+-, Visual Basic oder C++ geschriebene MSMQ-Anwendung sein.The non-WCF application can be an MSMQ application written using System.Messaging, COM+, Visual Basic, or C++.

Beachten Sie bei der Verwendung von MsmqIntegrationBinding folgende Punkte:When using MsmqIntegrationBinding, be aware of the following:

  • Ein WCF-Nachrichtentext ist nicht identisch mit einem MSMQ-Nachrichtentext.A WCF message body is not the same as a MSMQ message body. Wenn eine WCF-Nachricht mit einer Bindung in der Warteschlange zu senden, wird der WCF-Nachrichtentext in eine MSMQ-Nachricht platziert.When sending a WCF message using a queued binding, the WCF message body is placed inside of a MSMQ message. In der MSMQ-Infrastruktur wird diese Zusatzinformation jedoch nicht wahrgenommen, MSMQ sieht lediglich die MSMQ-Nachricht.The MSMQ infrastructure is oblivious to this extra information; it sees only the MSMQ message.

  • MsmqIntegrationBinding unterstützt die gängigen Serialisierungstypen.MsmqIntegrationBinding supports popular serialization types. Je nach Serialisierungstyp nimmt der Texttyp der generischen Nachricht - MsmqMessage<T> - unterschiedliche Typparameter an.Based on the serialization type, the body type of the generic message, MsmqMessage<T>, takes different type parameters. So ist bei ByteArray zum Beispiel MsmqMessage\<byte[]>Stream und bei MsmqMessage<Stream> der Parameter erforderlich.For example, ByteArray requires MsmqMessage\<byte[]> and Stream requires MsmqMessage<Stream>.

  • Mit XML-Serialisierung, können Sie angeben, den bekannten Typ mithilfe der KnownTypes -Attribut auf die <Verhalten > Element, das dann verwendet wird, um zu bestimmen, wie die XML-Nachricht zu deserialisieren.With XML serialization, you can specify the known type using the KnownTypes attribute on the <behavior> element that is then used to determine how to deserialize the XML message.

Siehe auchSee Also

Queuing in WCFQueuing in WCF
Vorgehensweise: Austauschen von Nachrichten in einer Warteschlange mit WCD-EndpunktenHow to: Exchange Queued Messages with WCF Endpoints
Vorgehensweise: Nachrichtenaustausch mit WCF-Endpunkten und Message Queuing-AnwendungenHow to: Exchange Messages with WCF Endpoints and Message Queuing Applications
Gruppieren von Nachrichten in der Warteschlange einer SitzungGrouping Queued Messages in a Session
Batchverarbeitung von Nachrichten in einer TransaktionBatching Messages in a Transaction
Verwenden von Warteschlangen für unzustellbare Nachrichten zur Handhabung von NachrichtenübertragungsfehlernUsing Dead-Letter Queues to Handle Message Transfer Failures
Behandlung nicht verarbeitbarer NachrichtenPoison Message Handling
Unterschiede zwischen den Warteschlangenfunktionen in Windows Vista, Windows Server 2003 und Windows XPDifferences in Queuing Features in Windows Vista, Windows Server 2003, and Windows XP
Sichern von Nachrichten mit TransportsicherheitSecuring Messages Using Transport Security
Sichern von Nachrichten mithilfe der NachrichtensicherheitSecuring Messages Using Message Security
Problembehandlung bei NachrichtenwarteschlangenTroubleshooting Queued Messaging