служебная шина исключения обмена сообщениями (.NET)
Служебная шина клиентская библиотека .NET создает исключения при возникновении ошибки операции службы или клиента. По возможности стандартные типы исключений .NET используются для передачи сведений об ошибке. Для сценариев, относящихся к служебная шина, создается исключение ServiceBusException.
Клиенты служебная шина автоматически повторяют исключения, которые считаются временными, после настроенных параметров повтора. При возникновении исключения в приложении все повторные попытки были применены безуспешно, или исключение считалось нетрансционным. Дополнительные сведения о настройке параметров повторных попыток см. в примере настройки параметров повтора.
ServiceBusException
Исключение содержит некоторые контекстные сведения, помогающие понять контекст ошибки и его относительную серьезность.
-
EntityPath
: определяет сущность служебная шина, из которой произошло исключение, если оно доступно. -
IsTransient
: указывает, считается ли исключение восстанавливаемым. В случае, когда она была признана временной, Служебная шина Azure уже применили соответствующую политику повторных попыток и все повторные попытки были неудачными. -
Message
: содержит описание ошибки, которая произошла и имеет соответствующий контекст. -
StackTrace
: представляет непосредственные кадры стека вызовов, указывая расположение в коде, в котором произошла ошибка. -
InnerException
: когда исключение было результатом операции службы, это частоMicrosoft.Azure.Amqp.AmqpException
экземпляр, описывающий ошибку, следуя спецификации OASIS Advanced Message Queuing Protocol (AMQP) 1.0. -
Reason
: предоставляет набор известных причин сбоя, которые помогают классифицировать и уточнять первопричину. Эти значения предназначены для применения фильтрации исключений и другой логики, где проверка текста сообщения об исключении не будет идеальной. Ниже приведены некоторые ключевые причины сбоя:ServiceTimeout
: указывает, что служба служебная шина не ответила на запрос операции в течение ожидаемого периода времени. Это может быть связано с временной проблемой сети или службой. Служба служебная шина может или не успешно завершила запрос. Состояние неизвестно. В контексте следующего доступного сеанса это исключение указывает, что в сущности не было разблокированных сеансов. Эти ошибки являются временными ошибками, которые автоматически извлекаются.QuotaExceeded
: обычно указывает, что для одной сущности слишком много активных операций приема. Чтобы избежать этой ошибки, уменьшите количество потенциальных одновременных приемов. Вы можете использовать пакетные приемы для попытки получения нескольких сообщений на запрос на получение. Дополнительные сведения см. в служебная шина квотах.MessageSizeExceeded
: указывает, что размер сообщения превысил максимальный размер сообщения. Размер сообщения содержит текст сообщения и все связанные метаданные. Лучший подход к разрешению этой ошибки — уменьшить количество сообщений, отправляемых в пакет или размер текста, включенного в сообщение. Так как ограничения размера могут быть изменены, см. служебная шина квоты для конкретных особенностей.MessageLockLost
: указывает, что блокировка сообщения потеряна. Вызывающие должны попытаться получить и снова обработать сообщение. Это исключение применяется только к сущностям, которые не используют сеансы. Эта ошибка возникает, если обработка занимает больше времени блокировки, а блокировка сообщения не обновляется. Эта ошибка также может возникать, когда ссылка отсоединяется из-за временной сетевой проблемы или при простое канала в течение 10 минут.Служба служебная шина использует протокол AMQP, который является отслеживанием состояния. В связи с характером протокола, если ссылка, которая подключает клиента и службу отсоединяется после получения сообщения, но до того, как сообщение будет решено, сообщение не может быть решено при повторном подключении ссылки. Связи могут быть отсоединяются из-за кратковременного временного сбоя сети, сбоя сети или из-за того, что служба принудилась к истечении 10-минутного простоя. Повторное подключение ссылки происходит автоматически в рамках любой операции, требующей ссылки, то есть урегулирования или получения сообщений. Из-за этого вы можете столкнуться
ServiceBusException
сReason
MessageLockLost
илиSessionLockLost
даже если время истечения срока действия блокировки еще не прошло.SessionLockLost
: указывает, что срок действия блокировки сеанса истек. Вызывающие абоненты должны попытаться снова принять сеанс. Это исключение применяется только к сущностям с поддержкой сеанса. Эта ошибка возникает, если обработка занимает больше времени блокировки, а блокировка сеанса не обновляется. Эта ошибка также может возникать, когда ссылка отсоединяется из-за временной сетевой проблемы или при простое канала в течение 10 минут. Служба служебная шина использует протокол AMQP, который является отслеживанием состояния. В связи с характером протокола, если ссылка, которая подключает клиента и службу отсоединяется после получения сообщения, но до того, как сообщение будет решено, сообщение не может быть решено при повторном подключении ссылки. Связи могут быть отсоединяются из-за кратковременного временного сбоя сети, сбоя сети или из-за того, что служба принудилась к истечении 10-минутного простоя. Повторное подключение ссылки происходит автоматически в рамках любой операции, требующей ссылки, то есть урегулирования или получения сообщений. Из-за этого вы можете столкнутьсяServiceBusException
сReason
MessageLockLost
илиSessionLockLost
даже если время истечения срока действия блокировки еще не прошло.MessageNotFound
: эта ошибка возникает при попытке получить отложенное сообщение по порядковой номеру сообщения, которое не существует в сущности или заблокировано в данный момент.SessionCannotBeLocked
: указывает, что запрошенный сеанс не может быть заблокирован, так как блокировка уже хранится в другом месте. После истечения срока действия блокировки сеанс можно принять.GeneralError
: указывает, что служба служебная шина столкнулась с ошибкой при обработке запроса. Обновления и перезапуски службы часто вызывают эту ошибку. Эти ошибки являются временными ошибками, которые автоматически извлекаются.ServiceCommunicationProblem
: указывает, что произошла ошибка связи со службой. Проблема может возникнуть из-за временной сетевой проблемы или проблемы службы. Эти ошибки являются временными ошибками, которые будут автоматически извлечены.ServiceBusy
: указывает, что служба регулирует запрос. Подробные сведения, описывающие, что может привести к регулированию запроса и как избежать регулирования, можно найти здесь. Запросы с регулированием извлекаются, но клиентская библиотека автоматически применяет 10 секунд обратно, прежде чем пытаться использовать те жеServiceBusClient
запросы (или любые подтипы, созданные из этого клиента). Это может привести к проблемам, если длительность блокировки вашей сущности меньше 10 секунд, так как блокировки сообщений или сеансов, скорее всего, будут потеряны для любых неустановленных сообщений или заблокированных сеансов. Так как запросы с регулированием успешно выполняются, созданные исключения будут регистрироваться в виде предупреждений, а не ошибок. Конкретное событие источника события уровня предупреждения равно 43 (при возникновении исключения и повторных попыток произошло исключение).MessagingEntityAlreadyExists
: указывает, что сущность с тем же именем существует в том же пространстве имен.MessagingEntityDisabled
: сущность обмена сообщениями отключена. Снова включите сущность с помощью портала.MessagingEntityNotFound
: служба служебная шина не может найти ресурс служебная шина.
Handle ServiceBusException — пример
Ниже приведен пример обработки ServiceBusException
и фильтрации по объекту Reason
.
try
{
// Receive messages using the receiver client
}
catch (ServiceBusException ex) when
(ex.Reason == ServiceBusFailureReason.ServiceTimeout)
{
// Take action based on a service time out
}
Другие распространенные исключения
-
ArgumentException
: клиент вызывает это исключение,ArgumentException
исходя из того, когда параметр, предоставленный при взаимодействии с клиентом, недопустим. Сведения о конкретном параметре и характере проблемы см. в разделеMessage
. -
InvalidOperationException
: возникает при попытке выполнить операцию, которая не является допустимой для текущей конфигурации. Это исключение обычно возникает, когда клиент не был настроен для поддержки операции. Часто его можно устранить, изменив параметры, переданные клиенту. -
NotSupportedException
: происходит, когда запрошенная операция допустима для клиента, но не поддерживается текущим состоянием. Сведения о сценарии см. в разделеMessage
. -
AggregateException
: происходит, когда операция может столкнуться с несколькими исключениями и отображает их как один сбой. Это исключение чаще всего возникает при запуске или остановке процессора служебная шина или процессора сеансов служебная шина.
Причина: QuotaExceed
ServiceBusException с заданной причиной QuotaExceeded
указывает, что превышена квота для конкретной сущности.
Примечание.
Сведения о квотах служебная шина см. в разделе "Квоты".
Очереди и разделы
В случае с очередями и разделами обычно дело в размере очереди. Свойство сообщения об ошибке содержит дополнительные сведения, как показано в следующем примере:
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
Сообщение уведомляет о том, что для раздела превышено ограничение размера, в данном случае 1 ГБ (ограничение по умолчанию).
Пространства имен
Для пространств имен исключение QuotaExceeded можно указать, что приложение превысило максимальное количество подключений к пространству имен. Например:
<tracking-id-guid>_G12 --->
System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]:
ConnectionsQuotaExceeded for namespace xxx.
Основные причины
Существует две распространенные причины этой ошибки: очередь недоставленных писем и нефункционирование получателей сообщений.
Очередь недоставленных сообщений. Средству чтения не удается завершить доставку сообщений, и сообщения возвращаются в очередь или раздел по истечении срока действия блокировки. Это может произойти, если читатель сталкивается с исключением, которое не позволяет ему завершить сообщение. После чтения сообщения 10 раз он перемещается в очередь недоставленных писем по умолчанию. Свойство MaxDeliveryCount управляет этим поведением, которое имеет значение по умолчанию 10. По мере накапливания сообщений в очереди недоставленных сообщений они начинают занимать много места.
Чтобы устранить эту проблему, считайте и завершите сообщения в очереди недоставленных сообщений, как и в любой другой очереди.
Получатель остановлен. Получатель перестал получать сообщения из очереди или подписки. Способ выявления проблемы заключается в просмотре активного количества сообщений. Если активное число сообщений большое или растущее, сообщения не считываются так быстро, как они записываются.
Причина: MessageLockLost
Причина
ServiceBusException с заданными причинами MessageLockLost
указывает, что сообщение получено с помощью режима получения PeekLock , а блокировка, удерживаемая клиентом, истекает на стороне службы.
Срок действия блокировки сообщения может истекать из-за различных причин:
- Срок действия таймера блокировки истек до его продления клиентским приложением.
- Клиентское приложение получило блокировку, сохранило ее в постоянном хранилище, а затем перезапустило. После перезапуска клиентское приложение посмотрело на пролетные сообщения и попыталось завершить сообщения.
Это исключение также может появиться в следующих сценариях:
- Обновление службы
- Обновление ОС
- Изменение свойств сущности (очереди, раздела, подписки) при удержании блокировки.
Разрешение
Когда клиентское приложение получает MessageLockLostException, оно больше не может обрабатывать сообщение. Клиентское приложение может дополнительно рассмотреть возможность ведения журнала исключения для анализа, но клиент должен удалить сообщение.
Так как срок действия блокировки сообщения истек, он вернется к очереди (или подписке) и может обрабатываться следующим клиентским приложением, которое вызывает получение.
Если превышено значение MaxDeliveryCount, сообщение может быть перемещено в DeadLetterQueue.
Причина: SessionLockLost
Причина
ServiceBusException с заданными причинами MessageLockLost
возникает при принятии сеанса, а блокировка, удерживаемая клиентом, истекает на стороне службы.
Срок действия блокировки сеанса может истекать из-за различных причин:
- Таймер блокировки истек до продления клиентского приложения.
- Клиентское приложение получило блокировку, сохранило ее в постоянном хранилище, а затем перезапустило. После перезапуска клиентское приложение просмотрело текущие сеансы и попыталось обработать в них сообщения.
Это исключение также может появиться в следующих сценариях:
- Обновление службы
- Обновление ОС
- Изменение свойств сущности (очереди, раздела, подписки) при удержании блокировки.
Разрешение
Когда клиентское приложение получает SessionLockLostException, оно больше не может обрабатывать сообщения в сеансе. Клиентское приложение может рассмотреть возможность ведения журнала исключения для анализа, но клиент должен удалить сообщение.
Так как срок действия блокировки сеанса истек, он вернется к очереди (или подписке) и может быть заблокирован следующим клиентским приложением, которое принимает сеанс. Так как блокировка сеанса всегда удерживается только одним клиентским приложением, обработка в нужном порядке гарантированно произойдет.
TimeoutException
TimeoutException указывает, что операция, инициированная пользователем, занимает больше времени ожидания операции.
Следует проверить значение свойства ServicePointManager.DefaultConnectionLimit, так как достижение этого ограничения также может породить исключение TimeoutException.
Ожидается, что время ожидания происходит во время или между операциями обслуживания, такими как обновления служб служебная шина (или) обновления ОС на ресурсах, запускающих службу. Во время обновлений ОС сущности перемещаются вокруг и узлы обновляются или перезагружаются, что может привести к истечению времени ожидания. Подробные сведения о Соглашении об уровне обслуживания (SLA) для службы служебной шины Azure см. в статье Соглашение об уровне обслуживания для служебной шины.
SocketException
Причина
Исключение SocketException возникает в следующих случаях.
- Если попытка подключения завершается ошибкой, так как узел не ответил должным образом после указанного времени (код ошибки TCP 10060).
- Сбой установленного подключения, так как подключенный узел не удалось ответить.
- Произошла ошибка обработки сообщения или удаленный узел превысил время ожидания.
- Базовая сетевая ошибка ресурса.
Разрешение
Ошибки SocketException указывают на то, что виртуальная машина, на которой размещены приложения, не может преобразовать имя <mynamespace>.servicebus.windows.net
в нужный IP-адрес.
Проверьте, выполнена ли следующая команда в сопоставлении с IP-адресом.
PS C:\> nslookup <mynamespace>.servicebus.windows.net
Что должно предоставить выходные данные, такие как:
Name: <cloudappinstance>.cloudapp.net
Address: XX.XX.XXX.240
Aliases: <mynamespace>.servicebus.windows.net
Если имя не разрешается для IP-адреса и псевдонима пространства имен, обратитесь к администратору сети для дальнейшего изучения. Обычно разрешение имен выполняется через DNS-сервер ресурсом в клиентской сети. Если разрешение DNS выполняется с помощью Azure DNS, обратитесь к поддержка Azure.
Если разрешение имен работает должным образом, проверьте, разрешены ли подключения к Служебная шина Azure здесь.
UnauthorizedAccessException
UnauthorizedAccessException указывает, что предоставленные учетные данные не позволяют выполнять запрошенное действие. Свойство Message
содержит сведения о сбое.
Рекомендуется выполнить эти действия проверки в зависимости от типа авторизации, предоставленной при создании ServiceBusClient
.
- Проверка правильности строка подключения
- Проверка правильности создания маркера SAS
- Убедитесь, что были предоставлены правильные роли управления доступом на основе ролей (RBAC)
Исключения георепликации
ServerBusyException
Причины
- Во время асинхронной репликации (задержка репликации больше нуля), клиент пытается выполнить операцию с сущностью служебной шины (очередь, раздел) или выполнить операцию управления, но операцию нельзя выполнить, так как задержка репликации между основными и дополнительными регионами превысила максимальную допустимую задержку репликации в секундах.
- Пример. Операция регулируется, так как с ней новая задержка репликации достигнет 38 323 секунд, что превышает максимальную задержку репликации, заданную (300 секунд). Текущая задержка репликации для последней операции репликации составляет 0 секунд.
- Очередь репликации для сущности превышает максимальный размер в байтах. Максимальный размер в байтах для очереди репликации — это внутреннее ограничение, заданное служебная шина.
- Пример: размер очереди репликации 73128000 превысил пороговое значение 67108864.
- В синхронной репликации время ожидания ожидания репликации другого запроса истекает.
-
Пример. Большой объем запросов от клиентского приложения для
<NAMESPACE>/<ENTITYNAME>
. Выполняется репликация в другие регионы.
-
Пример. Большой объем запросов от клиентского приложения для
Разрешение
- Клиент должен вернуться, чтобы предоставить службе время для обработки заданной рабочей нагрузки, то клиент должен повторить попытку.
Время ожидания истекло
Причина
- Исключение времени ожидания в географическом аварийном восстановления означает, что операция не завершена в течение указанного клиентом времени ожидания.
- При синхронной репликации основной регион операции записи и репликации в вторичные регионы находятся в пределах времени ожидания операции.
- При асинхронной репликации запись основного региона операции находится в пределах времени ожидания операции, но репликация операции в вторичные регионы не находится в пределах времени ожидания операции.
-
Пример. Операция не завершилась в течение выделенного времени 00:01:00 для сообщения объекта. (
ServiceTimeout
).
Разрешение
- Клиент должен повторить операцию.
- Возможно, были выполнены некоторые шаги операции ожидания. Возможно, операция ожидания может быть записана в основной регион и некоторые вторичные регионы. Если операция была записана в основной регион, она в конечном итоге реплицируется во все вторичные регионы независимо от времени ожидания клиента.
BadRequest
Причина
- Во время плановая отработка отказа основной регион временно устанавливается как доступный только для чтения, чтобы разрешить дополнительному региону выполнить перехват. Если клиент пытается выполнить операцию записи в основной регион, пока он находится в этом временном состоянии только для чтения, клиент получает исключение BadRequest.
- Пример. Параметр роли репликации выполняется, первичная реплика:<entity-name> — ReadOnly.
Разрешение
- Клиент должен ждать завершения плановая отработка отказа до успешной операции записи.
- Если плановая отработка отказа занимает слишком много времени, вместо этого можно активировать принудительное отработка отказа.
Следующие шаги
Полные справочные материалы по API служебной шины для .NET доступны в справочнике по API Azure для .NET. Советы по устранению неполадок см. в руководстве по устранению неполадок.