Sdílet prostřednictvím


Určování pořadí zpráv a časová razítka

Sekvencování a časové razítko jsou dvě funkce, které jsou vždy povolené na všech entitách služby Service Bus a zobrazují se prostřednictvím Sequence​Number vlastností EnqueuedTimeUtc přijatých nebo procházených zpráv.

V případech, kdy je absolutní pořadí zpráv významné a/nebo ve kterých spotřebitel potřebuje důvěryhodný jedinečný identifikátor pro zprávy, zprostředkovatel razí zprávy bez mezery a zvyšuje pořadové číslo vzhledem k frontě nebo tématu. U dělených entit je pořadové číslo vydáno vzhledem k oddílu.

Pořadové číslo

Hodnota SequenceNumber je jedinečné 64bitové celé číslo přiřazené ke zprávě, protože je přijato a uloženo zprostředkovatelem a funguje jako jeho interní identifikátor. U dělených entit odráží identifikátor oddílu nejvíce 16 bitů. Při vyčerpání rozsahu 64bitového nebo 48bitového rozsahu (s výjimkou 16 bitů pro identifikátor oddílu) se pořadová čísla převrácejí na nulu.

Pořadové číslo může být důvěryhodné jako jedinečný identifikátor, protože je přiřazeno centrální a neutrální autoritou, nikoli klienty. Představuje také skutečné pořadí doručení a je přesnější než časové razítko jako kritérium pořadí, protože časová razítka nemusí mít dostatek vysokého rozlišení v extrémních rychlostech zpráv a mohou být předmětem (ale minimální) nerovnoměrné distribuce hodin v situacích, kdy vlastnictví zprostředkovatele přechází mezi uzly.

Absolutní objednávka doručení je důležitá například v obchodních scénářích, ve kterých je omezený počet nabízených výrobků obsluhován na základě prvního doručení, zatímco dodávky naposledy; Příkladem je prodej vstupenek na koncerty.

Časové razítko

Funkce časového razítka funguje jako neutrální a důvěryhodná autorita, která přesně zachycuje čas UTC přijetí zprávy, které se projeví ve EnqueuedTimeUtc vlastnosti. Hodnota je užitečná, pokud obchodní scénář závisí na konečných termínech, například jestli byla pracovní položka odeslána k určitému datu před půlnocí, ale zpracování je daleko za backlogem fronty.

Poznámka:

Pořadové číslo na vlastní straně zaručuje pořadí front a pořadí extrakce zpráv, ale ne pořadí zpracování, které vyžaduje relace.

Řekněme, že fronta má 5 zpráv a 2 příjemce. Uživatel 1 vyzvedne zprávu 1. Uživatel 2 přebírá zprávu 2. Uživatel 2 dokončí zpracování zprávy 2 a vyzvedne zprávu 3, zatímco Uživatel 1 ještě není dokončen se zpracováním zprávy 1. Příjemce 2 dokončí zpracování zprávy 3, ale příjemce 1 ještě není dokončen se zpracováním zprávy 1. Příjemce 1 nakonec dokončí zpracování zprávy 1. Zprávy se tedy zpracovávají v tomto pořadí: zpráva 2, zpráva 3 a zpráva 1. Pokud potřebujete, aby se zpracovávala zpráva 1, 2 a 3, musíte použít relace.

Takže pokud zprávy stačí načíst v pořadí, nemusíte používat relace. Pokud je potřeba zpracovat zprávy v pořadí, použijte relace. Stejné ID relace by mělo být nastaveno u zpráv, které patří dohromady, což může být zpráva 1, 4 a 8 v jedné sadě a 2, 3 a 6 v jiné sadě.

Další informace najdete v tématu Relace zpráv služby Service Bus.

Plánované zprávy

Zprávy můžete odeslat do fronty nebo tématu pro zpožděné zpracování. Můžete třeba naplánovat úlohu, která bude systému pro zpracování dostupná v konkrétní čas. Tato funkce si uvědomuje spolehlivý plánovač založený na čase založený na distribuovaném čase.

Naplánované zprávy se ve frontě materializují, dokud definovaný čas nezařadí do fronty. Před tímto časem je možné naplánované zprávy zrušit. Zrušení odstraní zprávu.

Zprávy můžete plánovat pomocí některého z našich klientů dvěma způsoby:

  • Použijte běžné rozhraní API pro odesílání, ale před odesláním Scheduled​Enqueue​Time​Utc nastavte vlastnost zprávy.
  • Použijte rozhraní API pro plánování zpráv a předejte normální i naplánovaný čas. Rozhraní API vrátí naplánovanou zprávu SequenceNumber, kterou můžete později použít k zrušení naplánované zprávy v případě potřeby.

Naplánované zprávy a jejich pořadová čísla lze zjistit také pomocí procházení zpráv.

Naplánovaná SequenceNumber zpráva je platná pouze v době, kdy je zpráva v naplánovaném stavu. Při přechodu zprávy do aktivního stavu se zpráva připojí do fronty, jako by byla zařazena do fronty v aktuálním okamžiku, což zahrnuje přiřazení nového SequenceNumber.

Vzhledem k tomu, že je funkce ukotvená na jednotlivých zprávách a zprávy se dají začíst jenom jednou, service Bus nepodporuje opakované plány zpráv.

Poznámka:

  • Čas zařazení zprávy do fronty neznamená, že zpráva bude odeslána současně. Zařadí se do fronty, ale skutečný čas odeslání závisí na úloze fronty a jeho stavu.
  • Kvůli aspektům výkonu jsou aktivace a zrušení plánovaných zpráv nezávislé operace bez vzájemného uzamčení. Pokud je zpráva v procesu aktivace a je současně zrušena, proces aktivace nebude obrácen a zpráva bude stále aktivována. Navíc to může vést k zápornému počtu naplánovaných zpráv. Pokud chcete tento stav časování minimalizovat, doporučujeme vyhnout se plánování operací aktivace a zrušení v úzkém pořadí.

Použití plánovaných zpráv s pracovními postupy

Je běžné, že u delších obchodních pracovních postupů, které mají explicitní časovou komponentu, jako jsou 5minutové časové limity pro 2faktorové ověřování, hodinové časové limity pro uživatele potvrzující jejich e-mailovou adresu a vícedenní, týdenní nebo měsíční komponenty dlouhého času v doménách, jako je bankovnictví a pojištění.

Tyto pracovní postupy se často spouští zpracováním některých zpráv, které pak uloží nějaký stav, a pak naplánuje zprávu tak, aby proces pokračoval později. Architektury jako NServiceBus a MassTransit usnadňují integraci všech těchto prvků dohromady.

Další informace o zasílání zpráv služby Service Bus najdete v následujících tématech: