Share via


Service Bus mesajlaşma özel durumları (.NET)

Service Bus .NET istemci kitaplığı, bir hizmet işlemi veya istemci bir hatayla karşılaştığında özel durumlar ortaya çıkar. Mümkün olduğunda, hata bilgilerini iletmek için standart .NET özel durum türleri kullanılır. Service Bus'a özgü senaryolar için bir ServiceBusException oluşturulur.

Service Bus istemcileri, yapılandırılmış yeniden deneme seçeneklerini izleyerek geçici olarak kabul edilen özel durumları otomatik olarak yeniden dener. Uygulamaya bir özel durum uygulandığında, tüm yeniden denemeler başarısız olarak uygulanır veya özel durum geçici olarak kabul edilir. Yeniden deneme seçeneklerini yapılandırma hakkında daha fazla bilgi, Yeniden deneme seçeneklerini özelleştirme örneğinde bulunabilir.

ServiceBusException

Özel durum, hatanın bağlamını ve göreli önem derecesini anlamanıza yardımcı olacak bağlamsal bilgiler içerir.

  • EntityPath : Varsa, özel durumun oluştuğu Service Bus varlığını tanımlar.
  • IsTransient : Özel durumun kurtarılabilir olarak kabul edilip edilmeyeceğini gösterir. Geçici olarak kabul edildiği durumlarda, Azure Service Bus uygun yeniden deneme ilkesini zaten uygulamıştır ve tüm yeniden denemeler başarısız olmuştur.
  • Message : Oluşan hatanın açıklamasını ve ilgili bağlamı sağlar.
  • StackTrace : Hatanın oluştuğu koddaki konumu vurgulayarak çağrı yığınının anlık çerçevelerini temsil eder.
  • InnerException: Bir özel durum bir hizmet işleminin sonucu olduğunda, bu genellikle OASIS Gelişmiş Message Queuing Protokolü (AMQP) 1.0 belirtimini izleyerek hatayı açıklayan bir Microsoft.Azure.Amqp.AmqpException örnektir.
  • Reason : Başarısızlığın kök nedenini kategorilere ayırmaya ve netleştirmeye yardımcı olan iyi bilinen nedenler kümesi sağlar. Bu değerler, özel durum filtreleme ve özel durum iletisinin metninin incelenmesinin ideal olmayacağı diğer mantığın uygulanmasına izin vermek için tasarlanmıştır. Bazı önemli hata nedenleri şunlardır:
    • ServiceTimeout: Service Bus hizmetinin beklenen süre içinde bir işlem isteğine yanıt vermediğini gösterir. Geçici bir ağ sorunundan veya hizmet sorunundan kaynaklanıyor olabilir. Service Bus hizmeti isteği başarıyla tamamlamış veya tamamlamamış olabilir; durum bilinmiyor. Bir sonraki kullanılabilir oturum bağlamında, bu özel durum varlıkta kilidi açılmış oturum olmadığını gösterir. Bu hatalar, otomatik olarak yeniden denenen geçici hatalardır.

    • QuotaExceeded: Genellikle tek bir varlık için çok fazla etkin alma işlemi olduğunu gösterir. Bu hatayı önlemek için olası eşzamanlı alma sayısını azaltın. Alma isteği başına birden çok ileti almaya çalışmak için toplu alma işlemlerini kullanabilirsiniz. Daha fazla bilgi için bkz . Service Bus kotaları.

    • MessageSizeExceeded: İleti boyutunun maksimum ileti boyutunu aştığını gösterir. İleti boyutu, iletinin gövdesini ve ilişkili meta verileri içerir. Bu hatayı çözmek için en iyi yaklaşım, toplu olarak gönderilen iletilerin sayısını veya iletiye dahil edilen gövde boyutunu azaltmaktır. Boyut sınırları değiştirilebilir olduğundan bkz . Ayrıntılar için Service Bus kotaları .

    • MessageLockLost: İletideki kilidin kaybolduğunu gösterir. Arayanlar iletiyi almaya ve yeniden işlemeye çalışmalıdır. Bu özel durum yalnızca oturum kullanmayan varlıklar için geçerlidir. İşlem kilit süresinden uzun sürerse ve ileti kilidi yenilenmediyse bu hata oluşur. Bu hata, geçici bir ağ sorunu nedeniyle bağlantının ayrılması veya bağlantının 10 dakika boşta olması durumunda da oluşabilir.

      Service Bus hizmeti durum bilgisi olan AMQP protokollerini kullanır. Protokolün doğası gereği, istemciyi ve hizmeti bağlayan bağlantı bir ileti alındıktan sonra ayrılırsa, ancak ileti tamamlanmadan önce, ileti bağlantıyı yeniden bağlamaya yerleşemez. Kısa süreli geçici ağ hatası, ağ kesintisi veya hizmetin 10 dakikalık boşta kalma zaman aşımına uğraması nedeniyle bağlantılar ayrılabilir. Bağlantının yeniden bağlanması, bağlantıyı gerektiren herhangi bir işlemin bir parçası olarak otomatik olarak gerçekleşir, yani iletilerin yerleşmesi veya alınması. Bu davranış nedeniyle, kilit süre sonu süresi henüz geçmemiş olsa bile ile veya ile ReasonMessageLockLostSessionLockLost karşılaşabilirsiniz.ServiceBusException

    • SessionLockLost: Oturumdaki kilidin süresinin dolduğunu gösterir. Arayanlar oturumu yeniden kabul etmeye çalışmalıdır. Bu özel durum yalnızca oturum etkin varlıklar için geçerlidir. İşlem kilit süresinden uzun sürerse ve oturum kilidi yenilenmediyse bu hata oluşur. Bu hata, geçici bir ağ sorunu nedeniyle bağlantının ayrılması veya bağlantının 10 dakika boşta olması durumunda da oluşabilir. Service Bus hizmeti durum bilgisi olan AMQP protokollerini kullanır. Protokolün doğası gereği, istemciyi ve hizmeti bağlayan bağlantı bir ileti alındıktan sonra ayrılırsa, ancak ileti tamamlanmadan önce, ileti bağlantıyı yeniden bağlamaya yerleşemez. Kısa süreli geçici ağ hatası, ağ kesintisi veya hizmetin 10 dakikalık boşta kalma zaman aşımına uğraması nedeniyle bağlantılar ayrılabilir. Bağlantının yeniden bağlanması, bağlantıyı gerektiren herhangi bir işlemin bir parçası olarak otomatik olarak gerçekleşir, yani iletilerin yerleşmesi veya alınması. Bu davranış nedeniyle, kilit süre sonu süresi henüz geçmemiş olsa bile ile veya ile ReasonMessageLockLostSessionLockLost karşılaşabilirsiniz.ServiceBusException

    • MessageNotFound: Bu hata, varlıkta mevcut olmayan veya şu anda kilitli olan bir ileti için sıra numarasına göre ertelenen bir ileti almaya çalışırken oluşur.

    • SessionCannotBeLocked: Kilit zaten başka bir yerde tutulmuş olduğundan istenen oturumun kilitlenemiyor olduğunu gösterir. Kilidin süresi dolduktan sonra oturum kabul edilebilir.

    • GeneralError: Service Bus hizmetinin isteği işlerken bir hatayla karşılaştığını gösterir. Bu hata genellikle hizmet yükseltmeleri ve yeniden başlatmalardan kaynaklanır. Bu hatalar, otomatik olarak yeniden denenen geçici hatalardır.

    • ServiceCommunicationProblem: Hizmetle iletişim kurarken bir hata olduğunu gösterir. Sorun geçici bir ağ sorunundan veya hizmet sorunundan kaynaklanıyor olabilir. Bu hatalar, otomatik olarak yeniden denenecek geçici hatalardır.

    • ServiceBusy: Bir isteğin hizmet tarafından kısıtlandığını gösterir. Bir isteğin kısıtlanmasının nelere neden olabileceğini ve kısıtlanmasının nasıl önlendiğini açıklayan ayrıntılar burada bulunabilir. Kısıtlanmış istekler yeniden deneniyor, ancak istemci kitaplığı aynı ServiceBusClient (veya bu istemciden oluşturulan alt türleri) kullanarak daha fazla istek denemeden önce otomatik olarak 10 saniyelik geri alma işlemi uyguluyor. Varlığınızın kilit süresi 10 saniyeden kısaysa sorunlara neden olabilir çünkü ileti veya oturum kilitleri, düzeltilmemiş iletiler veya kilitli oturumlar için kaybolabilir. Kısıtlanmış istekler genellikle başarıyla yeniden denendiğinden, oluşturulan özel durumlar hatalar yerine uyarı olarak günlüğe kaydedilir - belirli uyarı düzeyi olay kaynağı olayı 43'tür (RunOperation bir özel durumla karşılaştı ve yeniden deneme gerçekleşti.)

    • MessagingEntityAlreadyExists: Aynı ad alanında aynı ada sahip bir varlığın bulunduğunu gösterir.

    • MessagingEntityDisabled: Mesajlaşma Varlığı devre dışı bırakıldı. Portalı kullanarak varlığı yeniden etkinleştirin.

    • MessagingEntityNotFound: Service Bus hizmeti bir Service Bus kaynağı bulamıyor.

ServiceBusException İşle - örnek

Burada, ve ServiceBusException filtresini ile işlemeye ilişkin bir örnek verilmiştır Reason.

try
{
    // Receive messages using the receiver client
}
catch (ServiceBusException ex) when
    (ex.Reason == ServiceBusFailureReason.ServiceTimeout)
{
    // Take action based on a service timeout
}

Diğer yaygın özel durumlar

  • ArgumentException: İstemci, istemciyle etkileşim kurarken sağlanan bir parametrenin geçersiz olduğu durumlardan türetilen ArgumentException bu özel durumu oluşturur. Belirli parametre ve sorunun doğası hakkındaki bilgileri içinde Messagebulabilirsiniz.
  • InvalidOperationException: Geçerli yapılandırması için geçerli olmayan bir işlemi gerçekleştirmeye çalışırken gerçekleşir. Bu özel durum genellikle bir istemci işlemi destekleyecek şekilde yapılandırılmadığında oluşur. Genellikle, istemciye geçirilen seçenekler ayarlanarak azaltılabilir.
  • NotSupportedException: İstenen bir işlem istemci için geçerli olduğunda, ancak geçerli durumu tarafından desteklenmediğinde gerçekleşir. Senaryo hakkındaki bilgileri içinde Messagebulabilirsiniz.
  • AggregateException: Bir işlem birden çok özel durumla karşılaşabileceğinden ve bunları tek bir hata olarak ortaya çıkardığında gerçekleşir. Bu özel durum en yaygın olarak Service Bus işlemcisini veya Service Bus oturum işlemcisini başlatırken veya durdururken karşılaşılır.

Neden: QuotaExceeded

Nedeni olarak ayarlanmış QuotaExceeded ServiceBusException, belirli bir varlık için kotanın aşıldığını gösterir.

Dekont

Service Bus kotaları için bkz . Kotalar.

Kuyruklar ve konular

Kuyruklar ve konular için genellikle kuyruğun boyutu kullanılır. Hata iletisi özelliği, aşağıdaki örnekte olduğu gibi daha fazla ayrıntı içerir:

Message: The maximum entity size has been reached or exceeded for Topic: 'xxx-xxx-xxx'. 
    Size of entity in bytes:1073742326, Max entity size in bytes:
1073741824..TrackingId:xxxxxxxxxxxxxxxxxxxxxxxxxx, TimeStamp:3/15/2013 7:50:18 AM

İleti, konu başlığının boyut sınırını aştığını belirtir; bu durumda 1 GB (varsayılan boyut sınırı).

Ad Alanları

QuotaExceeded özel durumu, ad alanları için bir uygulamanın ad alanına bağlantı sayısı üst sınırını aştığını gösterebilir. Örneğin:

<tracking-id-guid>_G12 ---> 
System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: 
ConnectionsQuotaExceeded for namespace xxx.

Olası nedenler

Bu hatanın iki yaygın nedeni vardır: teslim edilemeyen ileti kuyruğu ve işlevsiz ileti alıcıları.

  • Teslim edilemeyen ileti kuyruğu Bir okuyucu iletileri tamamlayamıyor ve kilit süresi dolduğunda iletiler kuyruğa/konuya döndürülüyor. Okuyucu, iletiyi tamamlamasını engelleyen bir özel durumla karşılaşırsa oluşabilir. İleti 10 kez okunduktan sonra, varsayılan olarak teslim edilemeyen ileti kuyruğuna geçer. Bu davranış MaxDeliveryCount özelliği tarafından denetlenür ve varsayılan değeri 10'dur. İletiler teslim edilemeyen ileti kuyruğuna yığıldıkça yer kaplar.

    Sorunu çözmek için, diğer tüm kuyruklardan yaptığınız gibi, teslim edilemeyen ileti kuyruğundaki iletileri okuyun ve tamamlayın.

  • Alıcı durdu. Alıcı bir kuyruktan veya abonelikten ileti almayı durdurdu. Sorunu tanımlamanın yolu, etkin ileti sayısına bakmaktır. Etkin ileti sayısı yüksekse veya artıyorsa, iletiler yazıldığı kadar hızlı okunmuyor demektir.

Neden: MessageLockLost

Neden

Nedeni ayarlanmış ServiceBusException, PeekLock Alma modu kullanılarak bir ileti alındığını ve istemci tarafından tutulan kilidin hizmet tarafında süresinin dolduğunu gösterir.MessageLockLost

Çeşitli nedenlerden dolayı iletideki kilidin süresi dolabilir:

  • İstemci uygulaması tarafından yenilenmeden önce kilit zamanlayıcısının süresi doldu.
  • İstemci uygulaması kilidi aldı, kalıcı bir depoya kaydetti ve sonra yeniden başlatıldı. Yeniden başlatıldıktan sonra istemci uygulaması ışıklı iletilere baktı ve iletileri tamamlamaya çalıştı.

Bu özel durumu aşağıdaki senaryolarda da alabilirsiniz:

  • Hizmet Güncelleştirmesi
  • İşletim sistemi güncelleştirmesi
  • Kilidi tutarken varlıkta (kuyruk, konu, abonelik) özellikleri değiştirme.

Çözüm

bir istemci uygulaması MessageLockLostException aldığında, artık iletiyi işleyemez. İstemci uygulaması isteğe bağlı olarak analiz için özel durumu günlüğe kaydetmeyi göz önünde bulundurabilir, ancak istemcinin iletiyi atması gerekir .

İletideki kilidin süresi dolduğundan, Kuyruk'a (veya Abonelik) geri döner ve çağrının aldığı sonraki istemci uygulaması tarafından işlenebilir.

MaxDeliveryCount aşıldıysa, ileti DeadLetterQueue'a taşınabilir.

Neden: SessionLockLost

Neden

Bir oturum kabul edildiğinde ve istemci tarafından tutulan kilidin süresi hizmet tarafında dolduğunda, nedeni ayarlanmış MessageLockLost ServiceBusException oluşturulur.

Bir oturumdaki kilidin süresi çeşitli nedenlerle dolabilir:

  • İstemci uygulaması tarafından yenilenmeden önce kilit zamanlayıcısının süresi doldu.
  • İstemci uygulaması kilidi aldı, kalıcı bir depoya kaydetti ve sonra yeniden başlatıldı. Yeniden başlatıldıktan sonra istemci uygulaması ışıklı oturumlara baktı ve bu oturumlardaki iletileri işlemeye çalıştı.

Bu özel durumu aşağıdaki senaryolarda da alabilirsiniz:

  • Hizmet Güncelleştirmesi
  • İşletim sistemi güncelleştirmesi
  • Kilidi tutarken varlıkta (kuyruk, konu, abonelik) özellikleri değiştirme.

Çözüm

bir istemci uygulaması SessionLockLostException aldığında, artık oturumdaki iletileri işleyemez. İstemci uygulaması analiz için özel durumu günlüğe kaydetmeyi göz önünde bulundurabilir, ancak istemcinin iletiyi atması gerekir .

Oturumdaki kilidin süresi dolduğundan, kuyrukta (veya Abonelikte) geri döner ve oturumu kabul eden sonraki istemci uygulaması tarafından kilitlenebilir. Oturum kilidi herhangi bir zamanda tek bir istemci uygulaması tarafından tutulduğundan, sıralı işleme garanti edilir.

TimeoutException

TimeoutException, kullanıcı tarafından başlatılan bir işlemin işlem zaman aşımı süresinden daha uzun sürdüğünü gösterir.

ServicePointManager.Default Bağlan ionLimit özelliğinin değerini denetlemeniz gerekir çünkü bu sınıra basılması timeoutException'a da neden olabilir.

Zaman aşımlarının, Service Bus hizmet güncelleştirmeleri (veya) hizmeti çalıştıran kaynaklardaki işletim sistemi güncelleştirmeleri gibi bakım işlemleri sırasında ya da bu işlemler arasında ortaya çıkması beklenir. İşletim sistemi güncelleştirmeleri sırasında varlıklar değişik yerlere taşınır ve düğümler güncelleştirilir veya yeniden başlatılır ve bunlar zaman aşımlarına neden olabilir. Azure Service Bus hizmetine ait hizmet düzeyi sözleşmesinin (SLA) ayrıntıları için bkz. Service Bus için SLA.

SocketException

Neden

Aşağıdaki durumlarda bir SocketException oluşturulur:

  • Ana bilgisayar belirtilen süreden sonra düzgün yanıt vermediğinden bağlantı girişimi başarısız olduğunda (TCP hata kodu 10060).
  • Bağlı ana bilgisayar yanıt veremediği için kurulan bağlantı başarısız oldu.
  • İleti işlenirken bir hata oluştu veya zaman aşımı uzak konak tarafından aşıldı.
  • Temel alınan ağ kaynağı sorunu.

Çözüm

SocketException hataları, uygulamaları barındıran VM'nin adı <mynamespace>.servicebus.windows.net ilgili IP adresine dönüştüremediğini gösterir.

Aşağıdaki komutun bir IP adresine eşlemede başarılı olup olmadığını denetleyin.

PS C:\> nslookup <mynamespace>.servicebus.windows.net

Bu, aşağıdaki gibi bir çıkış sağlamalıdır:

Name:    <cloudappinstance>.cloudapp.net
Address:  XX.XX.XXX.240
Aliases:  <mynamespace>.servicebus.windows.net

Yukarıdaki ad bir IP'ye ve ad alanı diğer adına çözümlenmiyorsa daha fazla araştırma yapmak için ağ yöneticisine başvurun. Ad çözümlemesi genellikle müşteri ağındaki bir DNS sunucusu aracılığıyla yapılır. DNS çözümlemesi Azure DNS tarafından yapılırsa Azure desteği başvurun.

Ad çözümlemesi beklendiği gibi çalışıyorsa burada Azure Service Bus bağlantılarına izin verilip verilmediğini denetleyin.

Unauthorizedaccessexception

UnauthorizedAccessException, sağlanan kimlik bilgilerinin istenen eylemin gerçekleştirilebilmesine izin vermediğini gösterir. özelliği hatayla Message ilgili ayrıntıları içerir.

oluştururken sağlanan yetkilendirme türüne bağlı olarak bu doğrulama adımlarını ServiceBusClientizlemenizi öneririz.

Sonraki adımlar

Service Bus .NET API başvurusunun tamamı için bkz . Azure .NET API başvurusu. Sorun giderme ipuçları için sorun giderme kılavuzuna bakın.