WarteschlangenübersichtQueues Overview

In diesem Abschnitt werden die allgemeinen Begriffe und Kernbegriffe der Warteschlangenkommunikation vorgestellt.This section introduces the general and core concepts behind queued communication. Die nachfolgenden Abschnitte enthalten Details dazu, wie die hier beschriebenen Warteschlangenbegriffe sich in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) auswirken.Subsequent sections go into details about how the queuing concepts described here are manifested in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF).

Grundlegende WarteschlangenbegriffeBasic Queuing Concepts

Beim Entwerfen einer verteilten Anwendung ist das Wählen der richtigen Transportart für die Kommunikation zwischen Diensten und Clients sehr wichtig.When designing a distributed application, choosing the right transport for communication between services and clients is important. Mehrere Faktoren beeinflussen, für welche Transportart Sie sich entscheiden sollten.Several factors affect the kind of transport to use. Ein wichtiger Faktor, nämlich die Isolation zwischen Dienst, Client und Transport, bestimmt die Verwendung eines Warteschlangentransports oder eines direkten Transports wie TCP oder HTTP.One important factor—isolation between the service, the client, and the transport—determines use of a queued transport or a direct transport, such as TCP or HTTP. Aufgrund des Aufbaus von direkten Transporten (wie TCP und HTTP) wird die Kommunikation vollständig gestoppt, wenn der Dienst oder der Client nicht ordnungsgemäß funktioniert oder wenn Netzwerkprobleme auftreten.Due to the nature of direct transports such as TCP and HTTP, communication stops altogether if the service or the client stop functioning or if the network fails. Der Dienst, der Client und das Netzwerk müssen gleichzeitig ausgeführt werden, damit die Anwendung funktioniert.The service, the client, and the network must be running at the same time for the application to work. Warteschlangentransporte ermöglichen eine Isolation. Dies bedeutet, dass der Client und der Dienst weiterhin funktionieren, wenn der Dienst bzw. der Client ausfallen oder wenn die jeweiligen Kommunikationsverbindungen ausfallen.Queued transports provide isolation, which means that if the service or client fail or if communication links between them fail, the client and service can continue to function.

Warteschlangen sorgen sogar für die zuverlässige Kommunikation, wenn Ausfälle bei den Kommunikationspartnern oder im Netzwerk auftreten.Queues provide reliable communication even with failures in the communicating parties or the network. Warteschlangen erfassen Nachrichten, die zwischen den Kommunikationspartnern ausgetauscht werden, und stellen diese zu.Queues capture and deliver messages exchanged between the communicating parties. Warteschlangen werden in der Regel von einem Speicher eines bestimmten Typs unterstützt, beispielsweise flüchtiger oder permanenter Speicher.Queues are typically backed by some kind of a store, which can be volatile or durable. Warteschlangen speichern Nachrichten für einen Dienst und leiten diese Nachrichten später dann an den Dienst weiter.Queues store messages from a client on behalf of a service and later forward these messages to the service. Die Dereferenzierungswarteschlangen ermöglichen eine sichere Fehlerisolation für beide Parteien. Aus diesem Grund ist dies der bevorzugte Kommunikationsmechanismus für Systeme, die eine hohe Verfügbarkeit erfordern, sowie für verteilte Dienste.The indirection queues provide ensured isolation of failure by either party, thus making it the preferred communication mechanism for high-availability systems and disconnected services. Die Dereferenzierung führt jedoch zu einer hohen Latenz.The indirection comes with the cost of high latency. Latenz ist die zeitverzögerung zwischen dem Zeitpunkt, die der Client eine Nachricht sendet und die Zeit, die der Dienst er empfängt.Latency is the time delay between the time the client sends a message and the time the service receives it. Dies bedeutet, dass Sie nach dem Senden einer Nachricht nicht wissen, wann die Nachricht verarbeitet wird.This means that once a message is sent, you do not know when that message may be processed. Die meisten Warteschlangenanwendungen weisen eine hohe Latenz auf.Most queued applications cope with high latency. Die folgende Abbildung zeigt ein Modell einer Warteschlangenkommunikation.The following illustration shows a conceptual model of queued communication.

Modell einer warteschlangenkommunikationModel of queued communication

Modell einer WarteschlangenkommunikationQueued communication conceptual model

In Wirklichkeit ist die Warteschlange verteilt angeordnet.In reality, the queue is a distributed concept. Eine Warteschlange kann also für eine Partei lokal oder für beide Parteien entfernt angeordnet sein.As such, they can be local to either party or remote to both parties. Normalerweise befindet sich die Warteschlange lokal beim Dienst.Typically, the queue is local to the service. Bei dieser Konfiguration kann der Client sich nicht darauf verlassen, dass die Verbindung zur Remotewarteschlange ständig verfügbar ist.In this configuration, the client cannot depend on connectivity to the remote queue to be constantly available. Außerdem muss die Warteschlange unabhängig von der Verfügbarkeit des Diensts, der aus der Warteschlange ausliest, verfügbar sein.Similarly, the queue must be available independent of the availability of the service reading from the queue. Ein Warteschlangen-Manager verwaltet eine Auflistung von Warteschlangen.A queue manager manages a collection of queues. Der Manager ist dafür verantwortlich, Nachrichten anzunehmen, die von anderen Warteschlangen-Managern an seine Warteschlangen gesendet werden.It is responsible for accepting messages sent to its queues from other queue managers. Er ist auch dafür verantwortlich, die Konnektivität zu Remotewarteschlangen zu verwalten und Nachrichten an diese Remotewarteschlangen zu übertragen.It is also responsible for managing connectivity to remote queues and transferring messages to those remote queues. Um die Verfügbarkeit auch bei Ausfällen der Client- oder Dienstanwendung sicherzustellen, wird der Warteschlangen-Manager normalerweise als externer Dienst ausgeführt.To ensure availability of queues despite client or service application failures, the queue manager is typically run as an external service.

Wenn ein Client eine Nachricht an eine Warteschlange sendet, adressiert er die Nachricht an die Zielwarteschlange. Dabei handelt es sich um die Warteschlange, die vom Warteschlangen-Manager des Diensts verwaltet wird.When a client sends a message to a queue, it addresses the message to the target queue, which is the queue managed by the service's queue manager. Der Warteschlangen-Manager auf dem Client sendet die Nachricht an eine Übertragungswarteschlange (auch: Ausgangswarteschlange).The queue manager on the client sends the message to a transmission (or outgoing) queue. Die Übertragungswarteschlange ist eine Warteschlange im Warteschlangen-Manager des Clients, in der die Nachrichten zur Übertragung an die Zielwarteschlange gespeichert werden.The transmission queue is a queue on the client queue manager that stores messages for transmission to the target queue. Der Warteschlangen-Manager ermittelt dann einen Pfad zu dem Warteschlangen-Manager, der die Zielwarteschlange verwaltet, und überträgt die Nachricht.The queue manager then finds a path to the queue manager that owns the target queue and transfers the message to it. Um eine zuverlässige Kommunikation sicherzustellen, implementieren die Warteschlangen-Manager zur Verhinderung von Datenverlusten ein zuverlässiges Übertragungsprotokoll.To ensure reliable communication, the queue managers implement a reliable transfer protocol to prevent data loss. Der Zielwarteschlangen-Manager nimmt an seine Zielwarteschlangen adressierte Nachrichten an und speichert die Nachrichten.The destination queue manager accepts messages addressed to the target queues it owns and stores the messages. Wenn der Dienst Leseanforderungen für die Zielwarteschlange sendet, stellt der Warteschlangen-Manager die Nachricht an die Zielanwendung zu.The service makes requests to read from the target queue, at which time the queue manager then delivers the message to the destination application. Die folgende Abbildung zeigt die Kommunikation zwischen den vier Parteien.The following illustration shows communication between the four parties.

In der Warteschlange AnwendungsdiagrammQueued Application Diagram

Warteschlangenkommunikation in einem typischen BereitstellungsszenarioQueued communication in a typical deployment scenario

Der Warteschlangen-Manager stellt die erforderliche Isolation bereit, damit es sich nicht auf die Kommunikation auswirkt, wenn der Absender und Empfänger einzeln ausfallen.Thus, the queue manager provides the required isolation so that the sender and receiver can independently fail without affecting actual communication. Der Vorteil der zusätzlichen Dereferenzierung, den Warteschlangen bieten, ermöglicht es außerdem, dass mehrere Anwendungsinstanzen aus ein und derselben Warteschlange auslesen, damit beim Farming zwischen den Knoten ein höherer Durchsatz erzielt wird.The benefit of extra indirection that queues provide also enables multiple application instances to read from the same queue, so that farming work among the nodes achieves higher throughput. Deshalb ist es nicht ungewöhnlich, dass Warteschlangen verwendet werden, um höhere Skalierungs- und Durchsatzanforderungen zu erfüllen.Therefore, it is not uncommon to see queues being used to achieve higher scale and throughput requirements.

Warteschlangen und TransaktionenQueues and Transactions

Transaktionen ermöglichen es Ihnen, mehrere Vorgänge zu gruppieren, so dass alle Vorgänge fehlschlagen, wenn ein Vorgang fehlschlägt.Transactions allow you to group a set of operations together so that if one operation fails, all of the operations fail. Ein Beispiel für die Verwendung von Transaktionen ist, wenn eine Person einen Betrag in Höhe von 1.000 € mithilfe eines entsprechenden Automaten von ihrem Sparkonto auf ihr Girokonto überweist.An example of how to use transactions is when a person uses an ATM to transfer $1,000 from his savings account to his checking account. Dazu sind die folgenden Vorgänge erforderlich:This entails the following operations:

  • Das Abbuchen von 1.000 € vom Sparkonto.Withdrawing $1,000 from the savings account.

  • Das Einzahlen von 1.000 € auf das Girokonto.Depositing $1,000 into the checking account.

Wenn der erste Vorgang erfolgreich ist und 1.000 € vom Sparkonto abgebucht werden, der zweite Vorgang jedoch fehlschlägt, sind die 1.000 € verloren, weil sie bereits vom Sparkonto abgebucht wurden.If the first operation succeeds and $1,000 is withdrawn from the savings account but the second operation fails, the $1,000 is lost because it has already been withdrawn from the savings account. Wenn ein Vorgang fehlschlägt, müssen also beide Vorgänge fehlschlagen, um für die Konten die richtigen Kontostände beizubehalten.To keep the accounts in a valid state, if one operation fails, both operations must fail.

Bei Verwendung von Transaktionsnachrichten können Nachrichten an die Warteschlange gesendet und von der Warteschlange im Rahmen einer Transaktion empfangen werden.In transactional messaging, messages can be sent to the queue and received from the queue under a transaction. Wenn eine Nachricht also über eine Transaktion gesendet und für die Transaktion ein Rollback ausgeführt wird, wird ein Zustand wiederhergestellt, als ob die Nachricht nie an die Warteschlange gesendet wurde.Thus, if a message is sent in a transaction and the transaction is rolled back, then the outcome is as if the message had never been sent to the queue. Wenn eine Nachricht über eine Transaktion empfangen und für die Transaktion ein Rollback ausgeführt wird, wird ebenfalls ein Zustand wiederhergestellt, als ob die Nachricht nie empfangen wurde.Similarly if a message is received in a transaction and the transaction is rolled back, then the outcome is as if the message had never been received. Die Nachricht verbleibt in der Warteschlange, damit sie bei Bedarf gelesen werden kann.The message remains in the queue to be read.

Aufgrund der hohen Latenz beim Senden einer Nachricht können Sie weder wissen, wie lange diese zum Erreichen der Zielwarteschlange benötigt, noch ist Ihnen bekannt, wie lange der Dienst zum Verarbeiten der Nachricht benötigt.Because of high latency, when you send a message you have no way of knowing how long it takes to reach its target queue, nor do you know how long it takes for the service to process the message. Aus diesem Grund sollten Sie keine einzelne Transaktion verwenden, um die Nachricht zu senden, die Nachricht zu empfangen und die Nachricht zu verarbeiten.Because of this, you do not want to use a single transaction to send the message, receive the message, and then process the message. Dabei wird eine Transaktion erstellt, für die für einen unbestimmten Zeitraum kein Commit besteht.This creates a transaction that is not committed for an indeterminate amount of time. Wenn ein Client und ein Dienst über eine Warteschlange mithilfe von Transaktionen kommunizieren, sind daran zwei Transaktionen beteiligt: eine beim Client und eine beim Dienst.When a client and service communicate through a queue using a transaction, two transactions are involved: one on the client and one on the service. Die folgende Abbildung zeigt die Transaktionsgrenzen einer typischen Warteschlangenkommunikation.The following illustration shows the transaction boundaries in typical queued communication.

Warteschlange mit TransaktionenQueue with transactions

Warteschlangenkommunikation mit separaten Transaktionen zur Erfassung und ZustellungQueued communication showing separate transactions for capture and delivery

Die Clienttransaktion verarbeitet und sendet die Nachricht.The client transaction processes and sends the message. Wenn ein Commit für die Transaktion ausgeführt wird, befindet sich die Nachricht in der Übertragungswarteschlange.When the transaction is committed, the message is in the transmission queue. Beim Dienst liest die Transaktion die Nachricht aus der Zielwarteschlange aus und führt für die Transaktion einen Commit aus.On the service, the transaction reads the message from the target queue, processes the message, and then commits the transaction. Wenn während der Verarbeitung ein Fehler auftritt, wird für die Nachricht ein Rollback ausgeführt, und sie wird wieder in die Zielwarteschlange eingefügt.If an error occurs during the processing, the message is rolled back and placed in the target queue.

Asynchrone Kommunikation mit WarteschlangenAsynchronous Communication Using Queues

Warteschlangen sind ein asynchrones Mittel der Kommunikation.Queues provide an asynchronous means of communication. Anwendungen, die Nachrichten mithilfe von Warteschlangen senden, können nicht darauf warten, dass die Nachricht vom Empfänger empfangen und verarbeitet wird. Dies liegt an der hohen Latenz des Warteschlangen-Managers.Applications that send messages using queues cannot wait for the message to be received and processed by the receiver because of high latency introduced by the queue manager. Nachrichten verbleiben ggf. für einen weit längeren Zeitraum in der Warteschlange, als die Anwendung beabsichtigt hat.Messages can remain in the queue for a far longer time than the application intended. Um dies zu vermeiden, kann die Anwendung für die Nachricht einen Gültigkeitsdauerwert angeben.To avoid this, the application can specify a Time-To-Live value on the message. Dieser Wert gibt an, wie lange die Nachricht in der Übertragungswarteschlange verbleiben soll.This value specifies how long the message should remain in the transmission queue. Wenn dieser Zeitwert überschritten wird und die Nachricht noch nicht an die Zielwarteschlange gesendet wurde, kann die Nachricht an eine Warteschlange für unzustellbare Nachrichten übertragen werden.If this time value is exceeded, and the message still has not been sent to the target queue, the message can be transferred to a dead-letter queue.

Wenn der Absender eine Nachricht sendet, sagt die Rückgabe des Sendevorgangs aus, dass die Nachricht nur bis in die Übertragungswarteschlange des Absenders gelangt ist.When the sender sends a message, the return from the send operation implies that the message only made it to the transmission queue on the sender. Wenn beim Senden der Nachricht an die Zielwarteschlange also ein Fehler auftritt, erfährt die sendende Anwendung dies nicht sofort.As such, if there is a failure in getting the message to the target queue, the sending application cannot know about it immediately. Um solche Fehler anzuzeigen, wird die fehlgeschlagene Nachricht in eine Warteschlange für unzustellbare Nachrichten übertragen.To take note of such failures, the failed message is transferred to a dead-letter queue.

Alle Fehler, beispielsweise eine Nachricht, die die Zielwarteschlange nicht erreicht oder deren Gültigkeitsdauer abgelaufen ist, müssen einzeln verarbeitet werden.Any error, such as a message failing to reach the target queue or the Time-To-Live expiring, must be processed separately. Es ist deshalb nicht ungewöhnlich, dass Warteschlangenanwendungen zwei Arten von Logik schreiben:It is not uncommon, therefore, for queued applications to write two sets of logic:

  • Die normale Client- und Dienstlogik zum Senden und Empfangen von Nachrichten.The normal client and service logic of sending and receiving messages.

  • Die Kompensationslogik zum Verarbeiten von Nachrichten, deren Übertragung oder Zustellung fehlgeschlagen ist.Compensation logic to handle messages from the failed transmission or delivery.

Diese Begriffe werden in den folgenden Abschnitten erläutert.The following sections discuss these concepts.

Programmierung der Warteschlange für unzustellbare NachrichtenDead-Letter Queue Programming

Warteschlangen für unzustellbare Nachrichten enthalten Nachrichten, die die Zielwarteschlange aus verschiedenen Gründen nicht erreichen.Dead-letter queues contain messages that failed to reach the target queue for various reasons. Die Gründe können von abgelaufenen Nachrichten bis zu Konnektivitätsproblemen reichen, die die Übertragung der Nachricht an die Zielwarteschlange verhindern.The reasons can range from expired messages to connectivity issues preventing transfer of the message to the target queue.

Normalerweise ist eine Anwendung dazu in der Lage, Nachrichten aus einer systemweiten Warteschlange für unzustellbare Nachrichten auszulesen, zu ermitteln, welcher Fehler vorliegt, und entsprechende Schritte einzuleiten, wie das Beheben der Fehler und das erneute Senden der Nachricht bzw. das Aufzeichnen des Status.Typically, an application can read messages from a system-wide dead-letter queue, determine what went wrong, and take appropriate action, such as correcting the errors and resending the message or taking note of it.

Programmierung für Warteschlangen für potenziell schädliche NachrichtenPoison Message Queue Programming

Nachdem eine Nachricht in der Zielwarteschlange eingetroffen ist, schlägt der Dienst beim Verarbeiten der Nachricht ggf. wiederholt fehl.After a message makes it to the target queue, the service may repeatedly fail to process the message. Eine Anwendung, die im Rahmen einer Transaktion eine Nachricht aus einer Warteschlange ausliest und eine Datenbank aktualisiert, kann zum Beispiel auf das Problem treffen, dass die Verbindung zur Datenbank vorübergehend unterbrochen ist.For example, an application reading a message from the queue under a transaction and updating a database may find the database temporarily disconnected. In diesem Fall wird für die Transaktion ein Rollback ausgeführt, es wird eine neue Transaktion erstellt, und die Nachricht wird erneut aus der Warteschlange ausgelesen.In this case, the transaction is rolled back, a new transaction is created, and the message is reread from the queue. Ein zweiter Versuch kann erfolgreich sein oder fehlschlagen.A second attempt may succeed or fail. Es kann je nach Fehlerursache auch vorkommen, dass die Nachricht wiederholt nicht an die Anwendung zugestellt wird.In some cases, depending on the cause of the error, the message may repeatedly fail delivery to the application. In diesem Fall wird die Nachricht als "potenziell schädlich" eingestuft.In this case, the message is deemed as "poison." Nachrichten dieser Art werden in eine Warteschlange für potenziell schädliche Nachrichten verschoben, die von einer Anwendung zur Bearbeitung von potenziell schädlichen Nachrichten gelesen werden kann.Such messages are moved to a poison queue that can be read by a poison-handling application.

Siehe auchSee Also

Queuing in WCFQueuing in WCF
Queuing in WCFQueuing in WCF
Sitzungen und WarteschlangenSessions and Queues
Warteschlangen für unzustellbare NachrichtenDead Letter Queues
Flüchtige Kommunikation unter Verwendung von WarteschlangenVolatile Queued Communication
Windows Communication Foundation zu Message QueuingWindows Communication Foundation to Message Queuing
Installieren von Message Queuing (MSMQ)Installing Message Queuing (MSMQ)
Message Queuing-Integration Bindung-BeispieleMessage Queuing Integration Binding Samples
Message Queuing zu Windows Communication FoundationMessage Queuing to Windows Communication Foundation
Nachrichtensicherheit über Message QueuingMessage Security over Message Queuing