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. Egy alkalmazás egy operátor segítségével kijavíthatja a problémákat, és újból elküldheti az üzenetet, naplózhatja, hogy hiba történt, és korrekciós műveletet hajthat végre.

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 peek-lock kézbesítést és 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.

DLQ-üzenetek száma

A témakör szintjén nem lehet lekérte a kézbesítetlen levelek üzenetsorában lévő üzenetek számát. Ennek az az oka, hogy 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.

Image showing 62 messages in the dead-letter queue.

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úl lett lépve.
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.
A munkamenet azonosítója null. A munkamenet engedélyezett entitása nem engedélyezi az olyan üzeneteket, amelyek munkamenet-azonosítója null értékű.
MaxTransferHopCountExceeded Túllépte az üzenetsorok közötti továbbítás engedélyezett ugrásainak maximális számát. 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.

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 lett kézbesítve, de vagy explicit módon el lett 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.

É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. This behavior is by design.

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 beállítást olyan éles környezetben, amelyben nem minden üzenettípus rendelkezik előfizetővel.

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.

Ez 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 ez azt eredményezheti, hogy egyes üzenetek túllépik az Azure Service Bus standard szintje 256 KB-os kvótakorlátját, ami azt is jelzi, hogy az éles környezetekhez a prémium szintű szintet kell használni.

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 törli a célsort vagy a témakört, a rendszer a 404-et kivételnek veti fel.
  • 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.

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

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

Mivel értékes üzleti adatok lehetnek a kézbesítetlen levelek üzenetsorában végződő üzenetekben, célszerű ezeket az üzeneteket újra feldolgozni, ha az operátorok már nem foglalkoznak azokkal a körülményekkel, amelyek miatt az üzenetek elhalt levélként lettek kézbesítve.

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 inkább felhasználói felülettel rendelkeznek, így elháríthatják, hogy mely üzenettípusok feldolgozása meghiúsult, mely forrássorokból és milyen okokból, miközben továbbra is újra lehet küldeni az újra feldolgozandó üzenetek kötegeit. Ezeket a képességeket olyan eszközök biztosítják, mint a ServicePulse és az NServiceBus .

Következő lépések

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.