Megosztás a következőn keresztül:


A Service Bus kézbesítetlen levelek üzenetsorainak áttekintése

Az Azure Service Bus-üzenetsorok és a témakör-előfizetések másodlagos allekérdezéseket biztosítanak, úgynevezett holtbetűs üzenetsort (DLQ). A kézbesíthetetlen levelek sorát nem kell külön létrehozni, és nem lehet a fő entitástól elkülönítve törölni vagy kezelni.

Ez a cikk a Service Bus üzenetsorait ismerteti. A vita nagy részét a Holt betűs üzenetsorok mintája szemlélteti a GitHubon.

A kézbesítetlen levelek üzenetsora

A kézbesítetlen levelek üzenetsorának célja, hogy olyan üzeneteket tároljon, amelyeket nem lehet kézbesíteni egyetlen fogadónak sem, vagy olyan üzeneteket, amelyeket nem sikerült feldolgozni. Az üzenetek ezután eltávolíthatók a DLQ-ból, és megvizsgálhatók. Előfordulhat, hogy egy alkalmazás lehetővé teszi, hogy a felhasználó kijavítsa a problémákat, és küldje el újra az üzenetet.

API- és protokoll szempontjából a DLQ többnyire hasonló minden más üzenetsorhoz, azzal a kivétellel, hogy az üzeneteket csak a szülő entitás holtbetűs műveletével lehet elküldeni. Emellett a rendszer nem figyeli meg az élettartamot, és a DLQ-ból nem tud üzenetet kézbesíteni. A kézbesítetlen levelek üzenetsora teljes mértékben támogatja a normál műveleteket, például a peek-lock kézbesítést, a fogadást és a törlést, valamint a tranzakciós műveleteket.

A DLQ-n nincs automatikus tisztítás. Az üzenetek a DLQ-ban maradnak mindaddig, amíg célzottan le nem kéri azokat a DLQ-ból, hogy befejezze a kézbesíthetetlen üzenetet.

A kézbesítetlen levelek üzenetsorának elérési útja

A kézbesítetlen levelek üzenetsorát az alábbi szintaxissal érheti el:

<queue path>/$deadletterqueue
<topic path>/Subscriptions/<subscription path>/$deadletterqueue

A .NET-ben használhatja a metódust FormatDeadLetterPath .

QueueClient.FormatDeadLetterPath(queuePath)
SubscriptionClient.FormatDeadLetterPath(topicPath, subscriptionName)

DLQ-üzenetek száma

A kézbesítetlen levelek üzenetsorában lévő üzenetek számának a témakör szintjén történő lekérése nem alkalmazható, mert az üzenetek nem a témakör szintjén ülnek. Ehelyett, amikor egy feladó üzenetet küld egy témakörnek, az üzenet a témakör előfizetéseihez lesz továbbítva ezredmásodpercen belül, így már nem a témakör szintjén található. Így a témakör előfizetéséhez társított DLQ-ban láthatja az üzeneteket. Az alábbi példában a Service Bus Explorer azt mutatja, hogy jelenleg 62 üzenet található a DLQ-ban a "test1" előfizetéshez.

62 üzenetet ábrázoló kép a kézbesítetlen levelek üzenetsorában.

A DLQ-üzenetek számát az Azure CLI parancs használatával is lekérheti: az servicebus topic subscription show.

Üzenetek áthelyezése a DLQ-ba

A Service Busban számos olyan tevékenység van, amely miatt az üzenetek az üzenetkezelő motoron belülről kerülnek leküldésre a DLQ-ba. Az alkalmazások explicit módon is áthelyezhetik az üzeneteket a DLQ-ba. A következő két tulajdonság (a holtbetű oka és a holtbetű leírása) lesz hozzáadva a holtbetűs üzenetekhez. Az alkalmazások saját kódokat határozhatnak meg a holtbetűs ok tulajdonsághoz, de a rendszer a következő értékeket állítja be.

Holtbetű oka Holt betűs hiba leírása
HeaderSizeExceeded A stream méretkvótája túllépte a korlátot.
TTLExpiredException Az üzenet lejárt, és a kézbesítetlenek üzenetek közé került. A részletekért tekintse meg az Élő idő szakaszt.
Session ID is null. A munkamenet engedélyezett entitása nem engedélyezi az olyan üzeneteket, amelyek munkamenet-azonosítója null értékű.
MaxTransferHopCountExceeded Az üzenetsorok közötti továbbításkor engedélyezett ugrások maximális száma túllépte a korlátot. Ez az érték 4 értékre van állítva.
MaxDeliveryCountExceeded Az üzenet nem használható fel a maximális kézbesítési kísérletek után. A részletekért tekintse meg a Kézbesítések maximális száma szakaszt.

Élettartam

Ha engedélyezi a kézbesítetlen levelek használatát az üzenetsorokon vagy előfizetéseken, a rendszer az összes lejáró üzenetet a DLQ-ba helyezi át. A holt betű okkódja a következőre van állítva: TTLExpiredException. A késleltetett üzenetek nem törlődnek, és nem kerülnek át a kézbesítetlen levelek üzenetsorába a lejáratuk után. Ez szándékosan van.

Szállítási mennyiség maximális száma

A Service Bus-üzenetsorok és -előfizetések üzenetküldési kísérleteinek száma korlátozott. Az alapértelmezett érték 10. Ha egy üzenet betekintő zárolás alatt érkezik, de vagy explicit módon el van hagyva, vagy a zárolás lejárt, a rendszer növeli az üzenet kézbesítési számát. Ha a kézbesítések száma meghaladja a korlátot, a rendszer áthelyezi az üzenetet a DLQ-ba. A DLQ-ban az üzenet holtbetűs oka a következőre van állítva: MaxDeliveryCountExceeded. Ez a viselkedés nem tiltható le, de a maximális kézbesítési számot nagy számra állíthatja be.

Az előfizetési szabályok feldolgozása során felmerülő hibák

Ha engedélyezi a holtbetűsítést a szűrőértékelési kivételek esetében, az előfizetés SQL-szűrőszabályának végrehajtása során előforduló hibák a DLQ-ban lesznek rögzítve a jogsértő üzenettel együtt. Ne használja ezt a lehetőséget olyan éles környezetben, ahol olyan üzenettípusok vannak, amelyeket a rendszer a témakörbe küld, és amelyek nem rendelkeznek előfizetőkkel, mivel ez nagy mennyiségű DLQ-üzenetet eredményezhet. Ezért győződjön meg arról, hogy a témakörnek küldött összes üzenet rendelkezik legalább egy egyező előfizetéssel.

Alkalmazásszintű holtbetűsítés

A rendszer által biztosított levélfelirat-kezelő funkciók mellett az alkalmazások a DLQ használatával explicit módon elutasíthatják az elfogadhatatlan üzeneteket. Tartalmazhatnak olyan üzeneteket, amelyek valamilyen rendszerhiba, hibásan formázott hasznos adatokat tartalmazó üzenetek vagy üzenetszintű biztonsági séma használata esetén sikertelen hitelesítést tartalmazó üzenetek miatt nem dolgozhatók fel megfelelően.

A .NET-ben a ServiceBusReceiver.DeadLetterMessageAsync metódus meghívásával végezhető el.

Javasoljuk, hogy adja meg a kivétel típusát a DeadLetterReason kivétel és a kivétel DeadLetterDescription veremkövetkezésében, mivel így könnyebben elhárítható a probléma oka, amely miatt az üzenetek elhaltak. Vegye figyelembe, hogy előfordulhat, hogy egyes üzenetek túllépik az Azure Service Bus standard rétegének 256 KB-os kvótakorlátját. A Service Bus-névteret a standard szintről a prémium szintre frissítheti, hogy magasabb kvóták és korlátok rendelkezzenek.

Holt betűzés automatikus továbbítási forgatókönyvekben

Az üzenetek a következő feltételek mellett lesznek elküldve a kézbesítetlen levelek üzenetsorába:

  • Egy üzenet négynél több üzenetsoron vagy egymáshoz láncolt témakörön halad át.
  • A célsor vagy témakör le van tiltva vagy törölve.
  • A cél üzenetsor vagy témakör meghaladja a maximális entitásméretet.

Holtbetűs küldés forgatókönyveken keresztül

  • Ha a célsor vagy témakör le van tiltva, a rendszer elküldi az üzenetet a forrás-üzenetsor átviteli üzenetsorába (TDLQ).
  • Ha a célsor vagy entitás meghaladja az entitás méretét, a rendszer elküldi az üzenetet a forrássor TDLQ-jának.

Kézbesítetlen levelek küldése az újrafeldolgozandó üzenetekre

Miután megoldotta azt a problémát, amely miatt az üzenet elhalt betűs volt, újból elküldheti az üzenetsorba vagy a feldolgozandó témakörbe.

Az olyan eszközök, mint az Azure Service Bus Explorer , lehetővé teszik az üzenetek manuális áthelyezését az üzenetsorok és a témakörök között. Ha a kézbesítetlen levelek üzenetsorában sok üzenetet kell áthelyezni, az ehhez hasonló kód segíthet egyszerre áthelyezni őket. Az operátorok gyakran szívesebben rendelkeznek felhasználói felülettel, hogy elháríthassák, hogy mely üzenettípusok feldolgozása meghiúsult, milyen forrássorokból és milyen okokból, miközben továbbra is képesek újra feldolgozni az újra feldolgozandó üzenetek kötegeit. Ezeket a képességeket olyan eszközök biztosítják, mint a ServicePulse és az NServiceBus .

Az üzenetsorok vagy előfizetések holtbetűsítésének engedélyezése című cikkből megtudhatja, hogyan konfigurálhatók a holtbetűk az üzenet lejárati beállításakor.