Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Azure Service Bus kuyrukları ve konu abonelikleri, teslim edilemeyen ileti kuyruğu (DLQ) olarak adlandırılan ikincil bir alt sıra sağlar. Ölü harf kuyruğunun doğrudan oluşturulması gerekmez ve ana varlıktan bağımsız olarak silinemez veya yönetilemez.
Bu makalede Service Bus'taki ölü harf kuyrukları açıklanmaktadır. Tartışmanın büyük bir kısmı GitHub'da Ölü Harf Sıraları örneğiyle açıklanmaktadır.
Ölü mektup kuyruğu
Ölü harf kuyruğunun amacı, herhangi bir alıcıya teslim edilemeyen 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 ana varlığın dead-letter 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.
Hatalı ileti kuyruğunun yolu
Aşağıdaki sözdizimini kullanarak dead-letter kuyruğuna erişebilirsiniz:
<queue path>/$deadletterqueue
<topic path>/Subscriptions/<subscription path>/$deadletterqueue
.NET'te FormatDeadLetterPath
yöntemini kullanabilirsiniz.
QueueClient.FormatDeadLetterPath(queuePath)
SubscriptionClient.FormatDeadLetterPath(topicPath, subscriptionName)
DLQ ileti sayısı
İletilerin konu düzeyinde bulunmaması nedeniyle, teslim edilemeyen ileti kuyruğundaki iletilerin sayısını konu düzeyinde elde etmek uygulanamaz. 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 abonelik için DLQ'da 62 ileti olduğunu gösterir: test1.
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 (ölü mektup nedeni ve ölü mektup açıklaması), ölü mektup mesajlarına eklenir. Uygulamalar, ölü harf nedeni özelliği için kendi kodlarını tanımlayabilir, ancak sistem aşağıdaki değerleri ayarlar.
Ölü mektup nedeni | Teslim edilemeyen mesaj hatası açıklaması |
---|---|
HeaderSizeExceeded |
Bu akış için veri boyut kotası aşıldı. |
TTLExpiredException |
İletinin süresi doldu ve ölü mektup olarak sınıflandırıldı. 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, maksimum teslim denemelerinden sonra tüketilemedi. Ayrıntılar için En fazla teslim sayısı bölümüne bakın. |
Yaşam süresi
Ölü harf kutusu (DLQ) özelliğini kuyruklarda veya aboneliklerde etkinleştirdiğinizde, süresi dolan tüm iletiler DLQ'ye taşınır. Ölü mektup neden kodu olarak ayarlanır: TTLExpiredException
. Ertelenen iletiler, süreleri dolduktan sonra temizlenmez ve ölü haber kuyruğuna taşınmaz. Bu davranış, tasarım gereğidir.
Maksimum teslim sayısı
Service Bus kuyrukları ve abonelikleri için mesaj teslim girişimlerinin sayısında bir sınır vardı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 ölü mektup nedeni olarak belirlenir: 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 doğrulama hatalarında ölü mektupla çalışmayı etkinleştirirseniz, bir aboneliğin SQL filtre kuralı yürütülürken oluşan hatalar, hatalı mesaj ile 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 ölü harf kutusu özelliklerine ek olarak, uygulamalar istenmeyen iletileri açıkça reddetmek için DLQ'yu 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ü DeadLetterReason
'ye ve yığın izlemesini DeadLetterDescription
'ye eklemenizi öneririz çünkü bu, mesajların yanıtsızlık kuyruğuna alınmasına neden olan sorunun çözülmesini 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 dead-letter kuyruğuna iletilir:
- Bir ileti, birbirine zincirlenmiş dörtten fazla kuyruk 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 başlık devre dışı bırakılırsa, ileti kaynak kuyruğun aktarım ölü mektup kuyruğuna (TDLQ) gönderilir.
- Hedef kuyruk veya varlık boyutunu aşarsa, ileti kaynak kuyruğun TDLQ'suna gönderilir.
Ölü mektup mesajlarını yeniden işlenmek üzere gönderme
İletinin ölü harfli olmasına neden olan sorunu çözdüğünüzde, yeniden işlenmesi için onu kuyruğa veya konuya yeniden gönderebilirsiniz. Bazı durumlarda, teslim edilemeyen ileti kuyruğunda taşınması gereken çok sayıda ileti varsa, bu tür kodlar tümünü aynı anda taşımaya yardımcı olabilir. Operatörler, hangi ileti türlerinin işlenemediğini, hangi kaynak kuyruklardan geldiğini ve bu durumun nedenlerini tespit edebilmek ve ardından sorunları gidermek için bir kullanıcı arabirimine sahip olmayı tercih ederler. Aynı zamanda, iletilerin toplu işlemlerini yeniden işleme gönderebilme imkânını da elde ederler.
Kullanılabilir araçlar
- Azure Service Bus Gezgini , iletilerin kuyruklar ve konular arasında el ile taşınmasını sağlar. İleti listesine bakmanıza ve yeniden işlenmek üzere yeniden göndermenize olanak tanır. İleti göndermek için kullandığınız SDK'ya bakılmaksızın Azure portalı üzerinden kullanılabilir.
- NServiceBus ile ServicePulse, bu merkezi panoyla hata işlemenizi kolaylaştırır. Hataları hızla görselleştirin, gruplandırma, filtreleme ve arama yapın ve tek tek veya gruplandırılmış iletileri verimli bir şekilde yeniden deneyin. NServiceBus uç noktaları için kullanılabilir.
- MassTransit ile ServicePulse, hata yönetimi için merkezi bir pano sağlar. Çeşitli ölçütleri kullanarak hataları görselleştirebilir, gruplandırabilir, filtreleyebilir ve arayabilirsiniz. Ayrıca tek tek iletileri düzenlemeyi ve yeniden denemeyi veya ileti gruplarını toplu olarak yeniden denemeyi de etkinleştirir. MassTransit uç noktaları için kullanılabilir.
İlgili içerik
İleti sona erme ayarındaki ölü harf gönderimini yapılandırmanın farklı yolları hakkında bilgi edinmek için kuyruk veya abonelik için ölü harf gönderimini etkinleştirme bölümüne bakın.