Service Bus teslim edilemeyen ileti kuyruklarına genel bakış

Azure Service Bus kuyrukları ve konu abonelikleri, teslim edilemeyen ileti kuyruğu (DLQ) olarak adlandırılan ikincil bir alt sıra sağlar. Teslim edilmeyen iletiler kuyruğunun doğrudan oluşturulması gerekmez ve DLQ ana tüzel kişilikten bağımsız olarak silinemez ve yönetilemez.

Bu makalede Service Bus'taki teslim edilemeyen kuyruklar açıklanmaktadır. Tartışmanın büyük bir kısmı GitHub'da Teslim Edilemeyen İleti kuyrukları örneği tarafından gösterilmiştir.

Teslim edilemeyen ileti kuyruğu

Teslim edilemeyen ileti kuyruğunun amacı, herhangi bir alıcıya teslim edilemeyen iletileri veya işlenemeyen iletileri tutmaktır. İletiler daha sonra DLQ'dan kaldırılabilir ve incelenebilir. Bir uygulama, bir işlecin yardımıyla sorunları düzeltebilir ve iletiyi yeniden göndererek bir hata olduğu gerçeğini günlüğe kaydedebilir ve düzeltici işlem gerçekleştirebilir.

API ve protokol açısından bakıldığında, DLQ çoğunlukla diğer tüm kuyruklara benzer, ancak iletiler yalnızca üst varlığın teslim edilemeyen işlemiyle gönderilebilir. Ayrıca, yaşam süresi gözlemlenmez ve DLQ'dan bir iletiyi geri yazamazsınız. Teslim edilemeyen ileti kuyruğu, peek-lock teslimini ve işlem işlemlerini tam olarak destekler.

DLQ otomatik olarak temizlenmez. İletiler, siz DLQ’dan geri alıp teslim edilemeyen iletiyi tamamlayana dek DLQ'da kalır.

DLQ ileti sayısı

Konu düzeyinde teslim edilemeyen ileti kuyruğundaki iletilerin sayısını almak mümkün değildir. Bunun nedeni iletilerin konu düzeyinde yer alamıyor olmasıdır. Bunun yerine, bir gönderen bir konuya ileti gönderdiğinde, ileti milisaniyeler içinde konu için aboneliklere iletilir ve bu nedenle artık konu düzeyinde bulunmaz. Bu nedenle, DLQ'da konu başlığına ilişkin abonelikle ilişkili iletileri görebilirsiniz. Aşağıdaki örnekte, Service Bus Gezgini şu anda "test1" aboneliği için DLQ'da 62 ileti olduğunu gösterir.

Image showing 62 messages in the dead-letter queue.

Azure CLI komutunu kullanarak DLQ iletilerinin sayısını da alabilirsiniz: az servicebus topic subscription show.

İletileri DLQ'ya taşıma

Service Bus'ta iletilerin mesajlaşma altyapısının içinden DLQ'ya gönderilmesine neden olan çeşitli etkinlikler vardır. Bir uygulama ayrıca iletileri açıkça DLQ'ya taşıyabilir. Aşağıdaki iki özellik (teslim edilemeyen harf nedeni ve teslim edilemeyen harf açıklaması) teslim edilemeyen iletilere eklenir. Uygulamalar, teslim edilemeyen neden özelliği için kendi kodlarını tanımlayabilir, ancak sistem aşağıdaki değerleri ayarlar.

Geçersiz harf nedeni Teslim edilemeyen harf hatası açıklaması
HeaderSizeExceeded Bu akış için boyut kotası aşıldı.
TTLExpiredException İletinin süresi doldu ve teslim edilmeyenler sırasına eklendi. Ayrıntılar için Yaşam süresi bölümüne bakın.
Oturum kimliği null. Oturumun etkin olduğu varlık, oturum tanımlayıcısı null olan bir iletiye izin vermiyor.
MaxTransferHopCountExceeded Kuyruklar arasında iletirken izin verilen atlama sayısı üst sınırı aşıldı. Bu değer 4 olarak ayarlanır.
MaxDeliveryCountExceeded İleti, en fazla teslim denemelerinden sonra kullanılamadı. Ayrıntılar için En fazla teslim sayısı bölümüne bakın.

Maksimum teslim sayısı

Service Bus kuyrukları ve abonelikleri için ileti teslim etme girişimlerinin sayısı sınırlıdır. Varsayılan değer 10'dur. Bir ileti bir peek-lock altında teslim edildiyse, ancak açıkça bırakıldığında veya kilidin süresi dolduğunda, iletideki teslim sayısı artırılır. Teslim sayısı sınırı aştığında ileti DLQ'ya taşınır. DLQ'daki iletinin teslim edilemeyen nedeni olarak ayarlanır: MaxDeliveryCountExceeded. Bu davranış devre dışı bırakılamaz, ancak en yüksek teslim sayısını büyük bir sayıya ayarlayabilirsiniz.

Yaşam süresi

Kuyruklarda veya aboneliklerde teslim edilemeyen iletileri etkinleştirdiğinizde, süresi dolan tüm iletiler DLQ'ye taşınır. Teslim edilemeyen neden kodu olarak ayarlanır: TTLExpiredException.

Ertelenen iletiler, süresi dolduktan sonra temizlenmez ve teslim edilemeyen ileti kuyruğuna taşınmaz. Bu davranış tasarım gereğidir.

Abonelik kuralları işlenirken oluşan hatalar

Filtre değerlendirme özel durumlarında geçersiz harfe çevirmeyi etkinleştirirseniz, aboneliğin SQL filtre kuralı yürütülürken oluşan hatalar, sorunlu iletiyle birlikte DLQ'da yakalanır. Bu seçeneği, tüm ileti türlerinin abonelerinin olmadığı bir üretim ortamında kullanmayın.

Uygulama düzeyinde teslim edilemeyen harf

Sistem tarafından sağlanan teslim edilemeyen yazma özelliklerine ek olarak, uygulamalar kabul edilemez iletileri açıkça reddetmek için DLQ kullanabilir. Bunlar herhangi bir sistem sorunu nedeniyle düzgün işlenemeyen iletiler, hatalı biçimlendirilmiş yükleri barındıran iletiler veya ileti düzeyinde bir güvenlik düzeni kullanıldığında kimlik doğrulaması başarısız olan iletiler içerebilir.

Bu, ServiceBusReceiver.DeadLetterMessageAsync yöntemi çağrılarak yapılabilir.

özel durumun türünü ve içindeki özel durumun DeadLetterReasonDeadLetterDescription yığın izlemesini eklemenizi öneririz çünkü iletilerde yanıtsız ileti gönderilmesine neden olan sorunun nedenini gidermeyi kolaylaştırır. Bunun, bazı iletilerin Azure Service Bus'ın Standart Katmanı için 256 KB kota sınırını aşmasıyla sonuçlanabilir ve bu da Premium Katmanın üretim ortamları için kullanılması gerektiğini belirtir.

Otomatik iletme senaryolarında geçersiz harfe çevirme

İletiler, aşağıdaki koşullar altında teslim edilemeyen ileti kuyruğuna gönderilir:

Senaryolar aracılığıyla göndermede geçersiz harf gönderme

  • Hedef kuyruk veya konu devre dışı bırakılırsa, ileti kaynak kuyruğun aktarım teslim edilemeyen ileti kuyruğuna (TDLQ) gönderilir.
  • Hedef kuyruk veya konu silinirse, 404 özel durumu oluşturulur.
  • Hedef kuyruk veya varlık varlık boyutunu aşarsa, ileti kaynak kuyruğun TDLQ'sa gönderilir.

Teslim edilemeyen ileti kuyruğunun yolu

Aşağıdaki söz dizimini kullanarak teslim edilemeyen ileti kuyruğuna erişebilirsiniz:

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

Yeniden işlenmek üzere teslim edilemeyen iletiler gönderme

İletilerde, teslim edilemeyen ileti kuyruğunda sonlanan değerli iş verileri olabileceğinden, işleçler iletilerin ilk etapta teslim edilmemeye neden olan durumlarla ilgilenmeyi bitirdiğinde bu iletilerin yeniden işlenmesini sağlamak tercih edilir.

Azure Service Bus Gezgini gibi araçlar, iletilerin kuyruklar ve konular arasında el ile taşınmasını sağlar. Teslim edilemeyen ileti kuyruğunda taşınması gereken çok sayıda ileti varsa, bunun gibi kodlar tümünün aynı anda taşınmasına yardımcı olabilir. İşleçler genellikle bir kullanıcı arabirimine sahip olmayı tercih eder ve bu sayede hangi ileti türlerinin işlenemediği, hangi kaynak kuyruklardan ve hangi nedenlerle yeniden işlenecek iletilerin toplu işlemlerini yeniden gönderebildikleri sorunlarını giderebilirler. NServiceBus ile ServicePulse gibi araçlar bu özellikleri sağlar.

Sonraki adımlar

İleti sona erme ayarında teslim edilemeyen harfi yapılandırmanın farklı yolları hakkında bilgi edinmek için bkz. Kuyruk veya abonelik için geçersiz harfle göndermeyi etkinleştirme.