Freigeben über


Nachrichtensequenzierung und -zeitstempel

Die Sequenzier- und Zeitstempelfunktionen sind in allen Service Bus-Entitäten und -Oberflächen über die Eigenschaften Sequence​Number und EnqueuedTimeUtc von empfangenen oder durchsuchten Nachrichten immer aktiviert.

In Fällen, in denen die absolute Reihenfolge der Nachrichten von Bedeutung ist und/oder ein Kunde einen vertrauenswürdigen eindeutigen Bezeichner für Nachrichten benötigt, versieht der Broker Nachrichten mit einem Stempel mit einer lückenlosen, aufsteigenden Sequenznummer relativ zur Warteschlange oder zum Thema. Bei partitionierten Entitäten wird die Sequenznummer relativ zur Partition ausgegeben.

Sequenznummer

Der Wert SequenceNumber ist eine eindeutige ganze 64-Bit-Zahl, die einer Nachricht zugeordnet wird, nachdem sie vom Broker akzeptiert und gespeichert wurde, und fungiert als ihr interner Bezeichner. Bei partitionierte Entitäten stellen die obersten 16 Bits den Partitionsbezeichner dar. Sequenznummern werden auf null zurückgesetzt, wenn der 64-Bit- oder 48-Bit-Bereich (mit Ausnahme der 16 Bit für den Partitionsbezeichner) erschöpft ist.

Die Sequenznummer kann als eindeutiger Bezeichner vertrauenswürdig sein, da sie nicht von Clients, sondern von einer zentralen und einer neutralen Autorität vergeben wird. Sie stellt auch die wahre Ankunftsreihenfolge dar und ist als Sortierkriterium genauer als ein Zeitstempel, da Zeitstempel bei extremen Nachrichtenraten möglicherweise keine ausreichend hohe Auflösung aufweisen und in Situationen, in denen der Brokerbesitz zwischen Knoten übergeht, einer (allerdings minimalen) Uhrabweichung unterliegen kann.

Die absolute Ankunftsreihenfolge ist beispielsweise in Geschäftsszenarien von Bedeutung, in denen eine begrenzte Anzahl von angebotenen Waren auf Grundlage des First-Come-First-Serve-Prinzips verarbeitet wird, solange der Vorrat reicht (z.B. beim Konzertkartenverkauf).

Timestamp

Die Zeitstempelfunktion dient als neutrale und vertrauenswürdige Instanz, die den UTC-Zeitpunkt eines Nachrichteneingangs über die EnqueuedTimeUtc-Eigenschaft präzise erfasst. Der Wert ist für terminabhängige Geschäftsszenarien nützlich, z.B. bei der Frage, ob ein Arbeitselement vor Mitternacht an einem bestimmten Datum übermittelt wurde, die Verarbeitung jedoch weit hinter dem Warteschlangenbacklog zurückliegt.

Hinweis

Die Sequenznummer an sich garantiert die Warteschlangenreihenfolge und die Extraktionsreihenfolge der Nachrichten, aber nicht die Verarbeitungsreihenfolge. Hierfür sind Sitzungen erforderlich.

Angenommen, es gibt fünf Nachrichten in der Warteschlange und zwei Consumer. Consumer 1 ruft Nachricht 1 ab. Consumer 2 ruft Nachricht 2 ab. Consumer 2 beendet die Verarbeitung von Nachricht 2 und ruft Nachricht 3 ab, während Consumer 1 die Verarbeitung von Nachricht 1 noch nicht abgeschlossen hat. Consumer 2 hat die Verarbeitung von Nachricht 3 abgeschlossen, Consumer 1 die Verarbeitung von Nachricht 1 jedoch noch nicht. Schließlich schließt Consumer 1 die Verarbeitung von Nachricht 1 ab. Die Nachrichten werden also in dieser Reihenfolge verarbeitet: Nachricht 2, Nachricht 3 und Nachricht 1. Wenn die Nachrichten 1, 2 und 3 der Reihe nach verarbeitet werden müssen, müssen Sie Sitzungen verwenden.

Wenn Nachrichten also nur der Reihe abgerufen werden müssen, müssen Sie keine Sitzungen verwenden. Wenn Nachrichten in der richtigen Reihenfolge verarbeitet werden müssen, verwenden Sie Sitzungen. Für Nachrichten, die zusammengehören, muss die gleiche Sitzungs-ID festgelegt werden. Dies können die Nachrichten 1, 4 und 8 in einer Gruppe und 2, 3 und 6 in einer anderen Gruppe sein.

Weitere Informationen finden Sie unter Nachrichtensitzungen.

Geplante Nachrichten

Sie können Nachrichten zur verzögerten Verarbeitung an eine Warteschlange oder ein Thema übergeben, um z.B. einen Auftrag zu planen, der an einem bestimmten Zeitpunkt für die Verarbeitung von einem System zur Verfügung gestellt werden soll. Mit dieser Funktion wird ein zuverlässiger, verteilter zeitbasierter Scheduler bereitgestellt.

Geplante Nachrichten materialisieren in der Warteschlange erst nach dem definierten Zeitpunkt der Einreihung in die Warteschlange. Davor können geplante Nachrichten abgebrochen werden. Durch einen Abbruch wird die Nachricht gelöscht.

Sie können Nachrichten mit einem unserer Clients auf zwei Arten planen:

  • Verwenden Sie die reguläre Sende-API, aber legen Sie die Scheduled​Enqueue​Time​Utc-Eigenschaft für die Nachricht vor dem Senden fest.
  • Verwenden Sie die API zum Planen von Nachrichten, und übergeben Sie sowohl die normale Nachricht als auch die geplante Zeit. Die API gibt die SequenceNumber der geplanten Nachricht zurück, mit der Sie diese bei Bedarf später löschen können.

Geplante Nachrichten und deren Sequenznummern können auch durch das Durchsuchen von Nachrichten ermittelt werden.

Die SequenceNumber für eine geplante Nachricht ist nur gültig, wenn sich die Nachricht im geplanten Zustand befindet. Wenn die Nachricht in den aktiven Zustand übergeht, wird sie so an die Warteschlange angefügt, als ob sie zum aktuellen Zeitpunkt in die Warteschlange eingereiht worden wäre, was auch die Zuweisung einer neuen SequenceNumber-Eigenschaft einschließt.

Da das Feature auf einzelne Nachrichten verankert ist und Nachrichten nur einmal abgefragt werden können, unterstützt Service Bus keine wiederkehrenden Zeitpläne für Nachrichten.

Hinweis

  • Der Zeitpunkt des Einreihens der Nachricht in die Warteschlange bedeutet nicht, dass die Nachricht auch zu diesem Zeitpunkt gesendet wird. Sie wird in die Warteschlange eingereiht, aber die tatsächliche Sendezeit hängt von der Workload der Warteschlange und ihrem Zustand ab.
  • Aufgrund von Leistungsaspekten sind die Aktivierung und Abbruch geplanter Nachrichten unabhängige Vorgänge ohne gegenseitige Sperrung. Wenn sich eine Nachricht im Prozess der Aktivierung befindet und gleichzeitig abgebrochen wird, wird der Aktivierungsprozess nicht rückgängig gemacht, und die Nachricht wird weiterhin aktiviert. Darüber hinaus kann dies potenziell zu einer negativen Anzahl geplanter Nachrichten führen. Um diese Racebedingung zu minimieren, wird empfohlen, die Planung von Aktivierungs- und Abbruchvorgängen in enger Folge zu vermeiden.

Verwenden geplanter Nachrichten mit Workflows

Geschäftsworkflows mit längerer Ausführungsdauer haben nicht selten eine explizite Zeitkomponente. Beispiele sind etwa fünfminütige Timeouts für die zweistufige Authentifizierung, Timeouts von einer Stunde für Benutzer, die ihre E-Mail-Adresse bestätigen, sowie Zeitkomponenten von mehreren Tagen, Wochen oder Monaten in Bereichen wie dem Bank- und Versicherungswesen.

Diese Workflows werden häufig durch die Verarbeitung einer Nachricht gestartet. Danach wird ein Zustand gespeichert und eine Nachricht geplant, um den Vorgang zu einem späteren Zeitpunkt fortzusetzen. Frameworks wie NServiceBus und MassTransit erleichtern die Integration all dieser Elemente.

Weitere Informationen zum Service Bus-Messaging finden Sie in folgenden Themen: