Dělené fronty a témata

Azure Service Bus využívá více zprostředkovatelů zpráv ke zpracování zpráv a více úložišť zpráv pro ukládání zpráv. Konvenční frontu nebo téma zpracovává jeden zprostředkovatel zpráv a je uložený v jednom úložišti zpráv. Oddíly služby Service Bus umožňují rozdělit fronty a témata nebo entity zasílání zpráv do oddílů napříč několika zprostředkovateli zpráv a úložišti zpráv. Dělení znamená, že celková propustnost dělené entity už není omezena výkonem jednoho zprostředkovatele zpráv nebo úložištěm zpráv. Kromě toho dočasný výpadek úložiště zpráv nevykreslí dělenou frontu nebo téma nedostupné. Dělené fronty a témata můžou obsahovat všechny pokročilé funkce služby Service Bus, jako je podpora transakcí a relací.

Poznámka:

Existují určité rozdíly mezi SKU Basic / Standard a Premium, pokud jde o dělení.

  • Dělení je k dispozici při vytváření entit pro všechny fronty a témata v SKU Basic nebo Standard. Obor názvů může mít dělené i nedělené entity.
  • Dělení je k dispozici při vytváření oboru názvů pro skladovou položku zasílání zpráv Premium a všechny fronty a témata v tomto oboru názvů budou rozděleny. Všechny dříve migrované dělené entity v oborech názvů Premium budou fungovat podle očekávání.
  • Pokud je v SKU Basic nebo Standard povolené dělení, vždy vytvoříme 16 oddílů.
  • Pokud je v SKU Premium povolené dělení, během vytváření oboru názvů se zadává množství oddílů.

Možnost dělení není možné změnit u žádného existujícího oboru názvů, fronty nebo tématu; možnost můžete nastavit pouze při vytváření entity.

Jak to funguje

Každá dělená fronta nebo téma se skládá z několika oddílů. Každý oddíl je uložený v jiném úložišti zpráv a zpracovává ho jiný zprostředkovatel zpráv. Když je zpráva odeslána do dělené fronty nebo tématu, Service Bus přiřadí zprávu k jednomu z oddílů. Výběr provádí Service Bus náhodně nebo pomocí klíče oddílu, který může odesílatel zadat.

Když chce klient přijímat zprávu z dělené fronty nebo z odběru děleného tématu, Service Bus se dotazuje na všechny oddíly pro zprávy a pak vrátí první zprávu získanou z libovolného úložiště zpráv příjemci. Service Bus ukládá ostatní zprávy do mezipaměti a vrací je, když obdrží více žádostí o příjem. Přijímající klient neví o dělení; Chování dělené fronty nebo tématu na straně klienta (například čtení, dokončení, odložení, deadletter, předběžné načtení) je stejné jako chování běžné entity.

Operace náhledu u nesouvisené entity vždy vrátí nejstarší zprávu, ale ne na dělené entitě. Místo toho vrátí nejstarší zprávu v jednom z oddílů, jejichž zprostředkovatel zpráv odpověděl jako první. Není zaručeno, že vrácená zpráva je nejstarší ve všech oddílech.

Při odesílání zprávy nebo přijímání zprávy z dělené fronty nebo tématu není potřeba nic dalšího.

Poznámka:

Operace náhledu vrátí nejstarší zprávu z oddílu na základě jejího pořadového čísla. U dělených entit je pořadové číslo vydáno vzhledem k oddílu. Další informace naleznete v tématu Pořadí zpráv a časové razítka.

Používání klíčů oddílů

Když se zpráva zařadí do rozdělené fronty nebo tématu, Service Bus zkontroluje přítomnost klíče oddílu. Pokud ho najde, vybere oddíl na základě daného klíče. Pokud klíč oddílu nenajde, vybere oddíl na základě interního algoritmu.

Použití klíče oddílu

Některé scénáře, jako jsou relace nebo transakce, vyžadují, aby se zprávy ukládaly do konkrétního oddílu. Všechny tyto scénáře vyžadují použití klíče oddílu. Všechny zprávy, které používají stejný klíč oddílu, jsou přiřazeny ke stejnému oddílu. Pokud je oddíl dočasně nedostupný, service Bus vrátí chybu.

V závislosti na scénáři se jako klíč oddílu používají různé vlastnosti zprávy:

SessionId: Pokud má zpráva nastavenou vlastnost ID relace, service Bus ji použije jako klíč oddílu. Tímto způsobem se všechny zprávy, které patří do stejné relace, zpracovávají stejný zprostředkovatel zpráv. Relace umožňují službě Service Bus zaručit řazení zpráv i konzistenci stavů relací.

PartitionKey: Pokud zpráva obsahuje vlastnost klíče oddílu, ale není nastavena vlastnost ID relace, service Bus použije hodnotu vlastnosti klíče oddílu jako klíč oddílu. Pokud zpráva obsahuje ID relace i sadu vlastností klíče oddílu, musí být obě vlastnosti identické. Pokud je vlastnost klíče oddílu nastavena na jinou hodnotu než vlastnost ID relace, service Bus vrátí neplatnou výjimku operace. Vlastnost klíče oddílu by se měla použít, pokud odesílatel odesílá transakční zprávy, které nejsou s vědomím. Klíč oddílu zajišťuje, že všechny zprávy odeslané v rámci transakce jsou zpracovávány stejným zprostředkovatelem zasílání zpráv.

MessageId: Pokud byla vytvořena fronta nebo téma s funkcí detekce duplicit a id relace nebo vlastnosti klíče oddílu nejsou nastaveny, pak hodnota vlastnosti ID zprávy slouží jako klíč oddílu. (Klientské knihovny Microsoftu automaticky přiřazují ID zprávy, pokud neodesílá aplikace.) V tomto případě se všechny kopie stejné zprávy zpracovávají stejným zprostředkovatelem zpráv. Toto ID umožňuje službě Service Bus zjišťovat a odstraňovat duplicitní zprávy. Pokud funkce detekce duplicit není povolená, služba Service Bus nepovažuje vlastnost ID zprávy za klíč oddílu.

Nepoužívá se klíč oddílu

Bez klíče oddílu služba Service Bus distribuuje zprávy kruhovým dotazem do všech oddílů dělené fronty nebo tématu. Pokud vybraný oddíl není dostupný, Service Bus přiřadí zprávu jinému oddílu. Díky tomu bude operace odeslání úspěšná i přes dočasnou nedostupnost úložiště zpráv. Nedosáhnete ale zaručeného pořadí, které poskytuje klíč oddílu.

Podrobnější informace o kompromisu mezi dostupností (bez klíče oddílu) a konzistencí (pomocí klíče oddílu) najdete v tématu Dostupnost a konzistence ve službě Event Hubs. S výjimkou ID oddílu, které nejsou vystaveny uživatelům, se tyto informace vztahují stejně na dělené entity služby Service Bus.

Pokud chcete službě Service Bus poskytnout dostatek času na zařazení zprávy do jiného oddílu, hodnota časového limitu určená klientem, který zprávu odešle, musí být větší než 15 sekund. Doporučuje se výchozí hodnota 60 sekund.

Klíč oddílu připne zprávu ke konkrétnímu oddílu. Pokud úložiště zpráv, které obsahuje tento oddíl, není k dispozici, služba Service Bus vrátí chybu. V případě absence klíče oddílu může Service Bus zvolit jiný oddíl a operace bude úspěšná. Proto doporučujeme, abyste nezadávejte klíč oddílu, pokud ho nepotřebujete.

Pokročilá témata

Použití transakcí s dělenými entitami

Zprávy odeslané v rámci transakce musí určovat klíč oddílu. Klíč může mít jednu z následujících vlastností: ID relace, klíč oddílu nebo ID zprávy. Všechny zprávy odeslané jako součást stejné transakce musí zadat stejný klíč oddílu. Pokud se pokusíte odeslat zprávu bez klíče oddílu v rámci transakce, service Bus vrátí neplatnou výjimku operace. Pokud se pokusíte odeslat více zpráv ve stejné transakci s různými klíči oddílu, service Bus vrátí neplatnou výjimku operace. Příklad:

CommittableTransaction committableTransaction = new CommittableTransaction();
using (TransactionScope ts = new TransactionScope(committableTransaction))
{
    ServiceBusMessage msg = new ServiceBusMessage("This is a message");
    msg.PartitionKey = "myPartitionKey";
    await sender.SendMessageAsync(msg); 
    ts.Complete();
}
committableTransaction.Commit();

Pokud je nastavená některá z vlastností, které slouží jako klíč oddílu, service Bus připne zprávu ke konkrétnímu oddílu. K tomuto chování dochází bez ohledu na to, zda se používá transakce. Pokud není potřeba, doporučujeme nezadávat klíč oddílu.

Použití transakcí v relacích s dělenými entitami

Chcete-li odeslat transakční zprávu do tématu nebo fronty pracujícím s relacemi, musí mít zpráva nastavenou vlastnost ID relace. Pokud je zadána také vlastnost klíče oddílu, musí být stejná jako vlastnost ID relace. Pokud se liší, service Bus vrátí neplatnou výjimku operace.

Na rozdíl od běžných (nedílných) front nebo témat není možné použít jednu transakci k odesílání více zpráv do různých relací. Při pokusu vrátí Service Bus neplatnou výjimku operace. Příklad:

CommittableTransaction committableTransaction = new CommittableTransaction();
using (TransactionScope ts = new TransactionScope(committableTransaction))
{
    ServiceBusMessage msg = new ServiceBusMessage("This is a message");
    msg.SessionId = "mySession";
    await sender.SendMessageAsync(msg); 
    ts.Complete();
}
committableTransaction.Commit();

Automatické přeposílání zpráv s dělenými entitami

Service Bus podporuje automatické přeposílání zpráv z, do nebo mezi dělenými entitami. Tuto funkci můžete povolit buď při vytváření nebo aktualizaci front a předplatných. Další informace naleznete v tématu Povolení přeposílání zpráv. Pokud zpráva určuje klíč oddílu (ID relace, klíč oddílu nebo ID zprávy), tento klíč oddílu se použije pro cílovou entitu.

Důležité informace a pokyny

  • Funkce vysoké konzistence: Pokud entita používá funkce, jako jsou relace, detekce duplicit nebo explicitní kontrola klíče dělení, operace zasílání zpráv se vždy směrují do konkrétního oddílu. Pokud některý z oddílů má vysoký provoz nebo základní úložiště není v pořádku, tyto operace selžou a sníží se dostupnost. Celkově je konzistence stále mnohem vyšší než nedílné entity; Na rozdíl od veškerého provozu dochází pouze k podmnožině provozu. Další informace najdete v této diskuzi o dostupnosti a konzistenci.
  • Správa: Operace, jako je vytvoření, aktualizace a odstranění, se musí provádět na všech oddílech entity. Pokud některý oddíl není v pořádku, může to mít za následek selhání těchto operací. Pro operaci Získat musí být informace, jako jsou počty zpráv, agregovány ze všech oddílů. Pokud některý oddíl není v pořádku, stav dostupnosti entity se ohlásí jako omezený.
  • Scénáře zpráv s nízkým objemem: Pro takové scénáře, zejména při použití protokolu HTTP, možná budete muset provést více operací příjmu, aby bylo možné získat všechny zprávy. Front-end pro příjem požadavků provede příjem u všech oddílů a ukládá všechny přijaté odpovědi do mezipaměti. Další požadavek na přijetí stejného připojení by z tohoto ukládání do mezipaměti byl přínosný a latence příjmu je nižší. Pokud ale máte více připojení nebo používáte protokol HTTP, pro každý požadavek se naváže nové připojení. Proto neexistuje žádná záruka, že by přistála na stejném uzlu. Pokud jsou všechny existující zprávy uzamčeny a uloženy v mezipaměti v jiném front-endu, vrátí operace příjmu hodnotu null. Platnost zpráv nakonec vyprší a můžete je znovu obdržet. Doporučuje se udržování protokolu HTTP. Pokud používáte dělení ve scénářích s nízkým objemem, operace příjmu můžou trvat déle, než se čekalo. Proto doporučujeme, abyste v těchto scénářích nepoužívejte dělení. Odstraňte všechny existující dělené entity a znovu je vytvořte pomocí zakázaného dělení, aby se zlepšil výkon.
  • Procházení a náhled zpráv: Operace náhledu nevrací vždy počet zpráv, které byly požádány. Toto chování má dva běžné důvody. Jedním z důvodů je, že agregovaná velikost kolekce zpráv překračuje maximální velikost. Dalším důvodem je to, že v dělených frontách nebo tématech nemusí mít oddíl dostatek zpráv k vrácení požadovaného počtu zpráv. Obecně platí, že pokud aplikace chce zobrazit nebo procházet určitý počet zpráv, měla by opakovaně volat operaci náhledu, dokud nezískne tento počet zpráv, nebo žádné další zprávy, které by se měly zobrazit. Další informace, včetně ukázek kódu, najdete v tématu Procházení zpráv.

Omezení dělených entit

Service Bus v současné době omezuje dělené fronty a témata následující omezení:

  • Pro dělené obory názvů Premium je velikost zprávy omezena na 1 MB, když se zprávy odesílají jednotlivě, a velikost dávky je omezena na 1 MB, když se zprávy odesílají v dávce.
  • Dělené fronty a témata nepodporují odesílání zpráv, které patří do různých relací v jedné transakci.
  • Service Bus v současné době umožňuje až 100 dělených front nebo témat na obor názvů pro skladovou položku Basic a Standard. Každá dělená fronta nebo téma se počítá do kvóty 10 000 entit na obor názvů.

Další kroky

Dělení můžete povolit pomocí webu Azure Portal, PowerShellu, rozhraní příkazového řádku, šablony Resource Manageru, .NET, Javy, Pythonu a JavaScriptu. Další informace naleznete v tématu Povolení dělení (Basic / Standard).

Přečtěte si o základních konceptech specifikace zasílání zpráv AMQP (Advanced Message Queueing Protocol) 1.0 v průvodci protokolem AMQP 1.0.