A Service Bus-tranzakciók feldolgozásának áttekintése

Ez a cikk a Microsoft Azure Service Bus tranzakciós képességeit ismerteti. A vita nagy részét a Tranzakciók minta szemlélteti. Ez a cikk a tranzakciófeldolgozás és a Service Bus szolgáltatáson keresztüli küldés áttekintésére korlátozódik, míg az Atomtranzakciók minta szélesebb körű és összetettebb hatókörű.

Megjegyzés:

  • A Service Bus alapszintje nem támogatja a tranzakciókat. A standard és a prémium szintű szintek támogatják a tranzakciókat. A szintek közötti különbségekért tekintse meg a Service Bus díjszabását.
  • A tranzakció felügyeleti és üzenetkezelési műveleteinek keverése nem támogatott.
  • A JavaScript SDK nem támogatja a tranzakciókat.

Tranzakciók a Service Busban

Egy tranzakció két vagy több műveletet egy végrehajtási hatókörbe csoportosít. Egy ilyen tranzakciónak természete szerint biztosítania kell, hogy egy adott műveletcsoporthoz tartozó összes művelet sikeres legyen, vagy közösen meghiúsuljon. Ebben a tekintetben a tranzakciók egy egységként működnek, amelyet gyakran neveznek atomiságnak.

A Service Bus egy tranzakciós üzenetközvetítő, és biztosítja a tranzakciós integritást az üzenettárolókon végzett összes belső művelethez. A Service Bus összes üzenettovábbítása, például az üzenetek kézbesítetlen levelek üzenetsorba való áthelyezése vagy az üzenetek entitások közötti automatikus továbbítása tranzakciós jellegű. Ilyen esetben, ha a Service Bus elfogad egy üzenetet, az már tárolva van, és sorszámmal van megjelölve. Ettől kezdve a Service Buson belüli üzenetátvitelek entitások közötti koordinált műveletek, és nem vezetnek veszteséghez (a forrás sikeres és a cél meghiúsul), vagy az üzenet duplikálásához (a forrás sikertelen és a cél sikeres).

A Service Bus támogatja az egyetlen üzenetküldő entitásra (üzenetsor, témakör, előfizetés) irányuló csoportosítási műveleteket egy tranzakció hatáskörén belül. Egy tranzakció hatóköréből például több üzenetet is küldhet egy üzenetsorba, és az üzenetek csak akkor lesznek véglegesítettek az üzenetsor naplójában, ha a tranzakció sikeresen befejeződött.

Tranzakciók hatókörébe tartozó műveletek

A tranzakció hatókörében végrehajtható műveletek a következők:

  • Küldés
  • Teljes
  • Megszakítás
  • Deadletter
  • Elhalasztja
  • Zárolás megújítása

A fogadási műveletek nem szerepelnek benne, mert feltételezzük, hogy az alkalmazás betekintő zárolási módban, valamilyen fogadási ciklusban vagy visszahívással szerez be üzeneteket, és csak ezután nyit meg egy tranzakciós hatókört az üzenet feldolgozásához.

Az üzenet elrendezése (teljes, elhagyás, elhalálozó levél, halasztás) ezután a tranzakció teljes eredményének hatókörén belül és attól függ.

Fontos

Az Azure Service Bus nem próbálkozik újra egy művelettel kivétel esetén, ha a művelet tranzakciós hatókörben van.

Olyan műveletek, amelyek nem szerepelnek a tranzakció hatóköreiben

Vegye figyelembe, hogy az adatbázisokba és más szolgáltatásokba, például a Cosmos DB-be érkező üzenetfeldolgozási kód nem sorolja be automatikusan az alárendelt erőforrásokat ugyanabba a tranzakciós hatókörbe. A forgatókönyvek kezelésével kapcsolatos további információkért tekintse meg az idempotens üzenetfeldolgozásra vonatkozó irányelveket.

Átvitelek és "küldés keresztül"

Ha engedélyezni szeretné az adatok tranzakciós átadását egy üzenetsorból vagy témakörből egy feldolgozóba, majd egy másik üzenetsorba vagy témakörbe, a Service Bus támogatja az átviteleket. Az átadási művelet során a feladó először üzenetet küld egy átviteli üzenetsornak vagy -témakörnek, és az átviteli üzenetsor vagy témakör azonnal áthelyezi az üzenetet a kívánt célsorba vagy témakörbe ugyanazzal a robusztus átadási implementációval, amelyet az automatikus továbbítási képesség támaszkodik. Az üzenet soha nem lesz elkötelezve az átviteli üzenetsor vagy a témakör naplójához oly módon, hogy láthatóvá váljon az átviteli üzenetsor vagy a témakör felhasználói számára.

Ennek a tranzakciós képességnek a teljesítménye akkor válik nyilvánvalóvá, ha az átviteli üzenetsor vagy a témakör maga a feladó bemeneti üzeneteinek forrása. Más szóval a Service Bus átviheti az üzenetet a cél üzenetsorba vagy témakörbe "keresztül" az átviteli üzenetsorba vagy a témakörbe, miközben teljes (vagy halasztási vagy holtbetűs) műveletet hajt végre a bemeneti üzeneten, mindezt egyetlen atomi műveletben.

Ha egy témakör-előfizetésből kell fogadnia, majd ugyanabban a tranzakcióban egy üzenetsorba vagy témakörbe kell küldenie, az átviteli entitásnak témakörnek kell lennie. Ebben a forgatókönyvben indítsa el a témakör tranzakciós hatókörét, fogadjon az előfizetéstől a tranzakció hatókörében, és küldje el az átviteli témakörön keresztül egy üzenetsorba vagy témakör céljára.

Megjegyzés:

Ha egy tranzakció hatókörében egy átviteli üzenetsoron keresztül küld üzenetet, TransactionPartitionKey az funkcionálisan egyenértékű a következővel PartitionKey: . Biztosítja, hogy az üzenetek egymás mellett és az átvitelük sorrendjében legyenek tárolva.

Lásd a kódban

Az ilyen átvitelek beállításához létre kell hoznia egy üzenetküldőt, amely az átviteli üzenetsoron keresztül célozza meg a célsort. Van egy fogadója is, amely ugyanabból az üzenetsorból kér le üzeneteket. Például:

Egy egyszerű tranzakció ezután ezeket az elemeket használja, ahogyan az alábbi példában is látható. A teljes példában a GitHub forráskódját olvassa el:

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();
}

A tulajdonságról további információt a EnableCrossEntityTransactions ServiceBusClientBuilder.enableCrossEntityTransactions metódus alábbi referenciaanyagában talál.

Időkorlát

Egy tranzakció 2 perc után túllépi az időkorlátot. A tranzakció időzítője a tranzakció első műveletének indításakor indul el.

Következő lépések

A Service Bus-üzenetsorokról az alábbi cikkekben talál további információt: