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, kullanıcının sorunları düzeltmesine ve iletiyi yeniden göndermesine izin verebilir.
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, teslime göz atma, alma ve silme ve işlem işlemleri gibi normal işlemleri tam olarak destekler.
DLQ otomatik olarak temizlenmez. İletiler, siz DLQ’dan geri alıp teslim edilemeyen iletiyi tamamlayana dek DLQ'da kalır.
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
.NET'te yöntemini kullanabilirsiniz FormatDeadLetterPath
.
QueueClient.FormatDeadLetterPath(queuePath)
SubscriptionClient.FormatDeadLetterPath(topicPath, subscriptionName)
DLQ ileti sayısı
İletiler konu düzeyinde yer almadığından, teslim edilemeyen ileti kuyruğundaki iletilerin sayısını konu düzeyinde almak geçerli değildir. 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.
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ı sınırı aştı. |
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. |
Session ID is 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ştı. 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. |
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.
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 edilir, 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.
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 aboneleri olmayan konuya gönderilen ileti türleriniz olan bir üretim ortamında kullanmayın çünkü bu durum DLQ iletilerinin büyük bir yüküne neden olabilir. Bu nedenle, konuya gönderilen tüm iletilerin en az bir eşleşen aboneliğe sahip olduğundan emin olun.
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.
.NET'te, ServiceBusReceiver.DeadLetterMessageAsync yöntemi çağrılarak yapılabilir.
özel durumun türünü ve içindeki özel durumun DeadLetterReason
DeadLetterDescription
yığın izlemesini eklemenizi öneririz çünkü iletilerde yanıtsız ileti gönderilmesine neden olan sorunun nedenini gidermeyi kolaylaştırır. Bazı iletilerin Azure Service Bus'ın Standart Katmanı için 256 KB kota sınırını aşması ile sonuçlanabilir. Daha yüksek kotalara ve sınırlara sahip olmak için Service Bus ad alanınızı standart katmandan premium katmana yükseltebilirsiniz.
Otomatik iletme senaryolarında geçersiz harfe çevirme
İletiler, aşağıdaki koşullar altında teslim edilemeyen ileti kuyruğuna gönderilir:
- İleti, zincirlenmiş dörtten fazla kuyruktan veya konu başlığından geçer.
- Hedef kuyruk veya konu devre dışı bırakıldı veya silindi.
- Hedef kuyruk veya konu başlığı, varlık boyutu üst sınırını aşıyor.
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 teslim edilemeyen ileti kuyruğuna (TDLQ) gönderilir.
- Hedef kuyruk veya varlık varlık boyutunu aşarsa, ileti kaynak kuyruğun TDLQ'sa gönderilir.
Yeniden işlenmek üzere teslim edilemeyen iletiler gönderme
İletinin teslim edilemeyen iletiye neden olan sorunu çözdüğünüzde, yeniden işlenecek kuyruğa veya konuya yeniden gönderebilirsiniz.
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 hangi ileti türlerinin işlenemediği, hangi kaynak kuyruklardan ve hangi nedenlerle yeniden işlenecek iletilerin toplu işlemlerini yeniden gönderebildiği sorunlarını giderebilmeleri için bir kullanıcı arabirimine sahip olmayı tercih eder. NServiceBus ile ServicePulse gibi araçlar bu özellikleri sağlar.
İlgili içerik
İ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.