Sdílet prostřednictvím


Přehled zpracování transakcí služby Service Bus

Tento článek popisuje možnosti transakcí služby Microsoft Azure Service Bus. Velká část diskuze je ilustrována ukázkou transakcí. Tento článek je omezen na přehled zpracování transakcí a odesílání prostřednictvím funkce ve službě Service Bus, zatímco ukázka atomických transakcí je širší a složitější v oboru.

Poznámka:

  • Úroveň Basic služby Service Bus nepodporuje transakce. Úrovně Standard a Premium podporují transakce. Rozdíly mezi těmito úrovněmi najdete v tématu Ceny služby Service Bus.
  • Kombinování operací správy a zasílání zpráv v transakci se nepodporuje.
  • JavaScript SDK nepodporuje transakce.

Transakce ve službě Service Bus

Transakce seskupí dvě nebo více operací do oboru provádění. Taková transakce musí ze své podstaty zajistit, aby všechny operace patřící dané skupině operací byly úspěšné nebo neúspěšné společně. V tomto ohledu transakce fungují jako jedna jednotka, která se často označuje jako atomicita.

Service Bus je transakční zprostředkovatel zpráv a zajišťuje transakční integritu pro všechny interní operace v úložištích zpráv. Všechny přenosy zpráv ve službě Service Bus, jako je přesun zpráv do fronty nedoručených zpráv nebo automatické přeposílání zpráv mezi entitami, jsou transakční. Pokud služba Service Bus přijme zprávu, už je uložená a označená pořadovým číslem. Od té doby jsou všechny přenosy zpráv v rámci služby Service Bus koordinovanými operacemi napříč entitami a nedojde ke ztrátě (zdroj bude úspěšný a cíl) nebo k duplikaci (zdroj selže a cíl proběhne úspěšně) zprávy.

Service Bus podporuje operace seskupení u jedné entity zasílání zpráv (fronty, tématu, odběru) v rámci oboru transakce. Můžete například odeslat několik zpráv do jedné fronty z oboru transakce a zprávy budou potvrzeny pouze do protokolu fronty po úspěšném dokončení transakce.

Operace v rámci oboru transakce

Operace, které lze provádět v rámci oboru transakce, jsou následující:

  • Odeslat
  • Dokončit
  • Opustit
  • Deadletter
  • Odložit
  • Obnovit zámek

Operace příjmu nejsou zahrnuty, protože se předpokládá, že aplikace získává zprávy pomocí režimu náhledu uzamčení, uvnitř nějaké smyčky příjmu nebo zpětného volání a teprve potom otevře obor transakce pro zpracování zprávy.

Dispozice zprávy (úplná, opuštěná, nedoručených zpráv, pozdržet) se pak vyskytuje v rozsahu a závisí na celkovém výsledku transakce.

Důležité

Azure Service Bus neopakuje operaci v případě výjimky, pokud je operace v oboru transakce.

Operace, které se nezačtou do oborů transakcí

Mějte na paměti, že kód pro zpracování zpráv, který volá databáze a další služby, jako je Cosmos DB, automaticky nezařadí tyto podřízené prostředky do stejného transakčního oboru. Další informace o tom, jak tyto scénáře zpracovat, najdete v pokynech k idempotentnímu zpracování zpráv.

Přenosy a "odesílání prostřednictvím"

Pokud chcete povolit transakční předávání dat z fronty nebo tématu do procesoru a pak do jiné fronty nebo tématu, service Bus podporuje přenosy. Při operaci přenosu odesílatel nejprve odešle zprávu do fronty přenosu nebo tématu a fronta přenosu nebo téma okamžitě přesune zprávu do zamýšlené cílové fronty nebo tématu pomocí stejné robustní implementace přenosu, na kterou spoléhá funkce automatického přenosu. Zpráva se nikdy nezapíše do protokolu přenosové fronty nebo tématu tak, aby byla viditelná pro příjemce fronty přenosu nebo tématu.

Síla této transakční schopnosti se zjeví, když samotná fronta přenosu nebo téma je zdrojem vstupních zpráv odesílatele. Jinými slovy, Service Bus může přenést zprávu do cílové fronty nebo tématu "prostřednictvím" fronty přenosu nebo tématu při provádění úplné operace (nebo pozdržet nebo nedoručených zpráv) ve vstupní zprávě, a to vše v jedné atomické operaci.

Pokud potřebujete přijmout z odběru tématu a pak odeslat do fronty nebo tématu ve stejné transakci, musí být entita převodu tématem. V tomto scénáři spusťte obor transakce v tématu, přijímat z předplatného s v oboru transakce a odesílat prostřednictvím tématu přenosu do fronty nebo tématu cíl.

Poznámka:

  • Pokud je zpráva odeslána prostřednictvím přenosové fronty v oboru transakce, TransactionPartitionKey je funkčně ekvivalentní PartitionKey. Zajišťuje, že se zprávy budou uchovávat pohromadě a v pořadí při jejich přenosu.
  • Pokud je odstraněna cílová fronta nebo téma, vyvolá se výjimka 404.

Zobrazit ho v kódu

Pokud chcete takové přenosy nastavit, vytvoříte odesílatele zprávy, který cílí na cílovou frontu prostřednictvím fronty přenosu. Máte také příjemce, který přijímá zprávy ze stejné fronty. Příklad:

Jednoduchá transakce pak použije tyto prvky, jako v následujícím příkladu. Úplný příklad najdete ve zdrojovém kódu na GitHubu:

var options = new ServiceBusClientOptions { EnableCrossEntityTransactions = true };
await using var client = new ServiceBusClient(connectionString, options);

ServiceBusReceiver receiverA = client.CreateReceiver("queueA");
ServiceBusSender senderB = client.CreateSender("queueB");

ServiceBusReceivedMessage receivedMessage = await receiverA.ReceiveMessageAsync();

using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
    await receiverA.CompleteMessageAsync(receivedMessage);
    await senderB.SendMessageAsync(new ServiceBusMessage());
    ts.Complete();
}

Další informace o EnableCrossEntityTransactions vlastnosti naleznete v následující referenční serviceBusClientBuilder.enableCrossEntityTransactions – metoda.

Timeout

Transakce vyprší po 2 minutách. Časovač transakce se spustí při spuštění první operace v transakci.

Další informace o frontách služby Service Bus najdete v následujících článcích: