Compartir vía


Excepciones de mensajería de Service Bus (.NET)

La biblioteca cliente de .NET de Service Bus muestra excepciones cuando una operación de servicio o un cliente encuentra un error. Cuando sea posible, los tipos de excepciones estándar de .NET se usan para transmitir información de error. Para escenarios específicos de Service Bus, se produce una excepción ServiceBusException.

Los clientes de Service Bus reintentan automáticamente las excepciones que se consideran transitorias, siguiendo las opciones de reintento configuradas. Cuando aparece una excepción en la aplicación, o bien todos los reintentos se aplicaron sin éxito, o bien la excepción se consideró no transitoria. Encontrará más información sobre la configuración de las opciones de reintento en el ejemplo Personalización de las opciones de reintento.

ServiceBusException

La excepción incluye información contextual que le ayudará a comprender el contexto del error y su gravedad relativa.

  • EntityPath: identifica la entidad de Service Bus desde la que se produjo la excepción, si está disponible.
  • IsTransient: indica si la excepción se considera recuperable o no. En el caso de que se considere transitorio, Azure Service Bus ya ha aplicado la directiva de reintento adecuada y todos los reintentos no se realizaron correctamente.
  • Message: proporciona una descripción del error que se produjo y el contexto pertinente.
  • StackTrace: representa los marcos inmediatos de la pila de llamadas, resaltando la ubicación en el código donde se produjo el error.
  • InnerException: cuando una excepción es el resultado de una operación de servicio, suele ser una instancia Microsoft.Azure.Amqp.AmqpException que describe el error, siguiendo la especificación OASIS Advanced Message Queuing Protocol (AMQP) 1.0.
  • Reason: proporciona un conjunto de razones conocidas para el error que ayuda a clasificar y aclarar la causa principal. Estos valores están pensados para permitir la aplicación del filtrado de excepciones y otra lógica cuando la inspección del texto de un mensaje de excepción no sería lo ideal. Algunos motivos de error clave son:
    • ServiceTimeout: indica que el servicio Service Bus no respondió a una solicitud de operación dentro del período de tiempo esperado. Puede deberse a un problema transitorio de red o a un problema de servicio. Es posible que el servicio de Service Bus haya completado correctamente la solicitud; el estado no se conoce. En el contexto de la siguiente sesión disponible, esta excepción indica que no había sesiones desbloqueadas disponibles en la entidad. Estos errores son errores transitorios que se reintentan automáticamente.

    • QuotaExceeded: normalmente indica que hay demasiadas operaciones de recepción activas para una sola entidad. Para evitar este error, reduzca el número de posibles recepciones simultáneas. Puede usar la recepción por lotes para intentar recibir varios mensajes por solicitud de recepción. Para más información, consulte Cuotas de Service Bus.

    • MessageSizeExceeded: indica que el tamaño del mensaje superó el tamaño máximo del mensaje. El tamaño del mensaje incluye el cuerpo del mensaje y los metadatos asociados. El mejor enfoque para resolver este error es reducir el número de mensajes que se envían en un lote o el tamaño del cuerpo incluido en el mensaje. Dado que los límites de tamaño están sujetos a cambios, consulte Cuotas de Service Bus para obtener detalles.

    • MessageLockLost: indica que se pierde el bloqueo del mensaje. Los autores de llamadas deben intentar recibir y procesar el mensaje de nuevo. Esta excepción solo se aplica a las entidades que no usan sesiones. Este error se produce si el procesamiento tarda más tiempo que la duración del bloqueo y el bloqueo del mensaje no se renueva. Este error también puede producirse cuando el vínculo se desasocia debido a un problema de red transitorio o cuando el vínculo está inactivo durante 10 minutos.

      El servicio Service Bus usa el protocolo AMQP, que es con estado. Debido a la naturaleza del protocolo, si el vínculo que conecta el cliente y el servicio se desasocia después de recibir un mensaje, pero antes de que se resuelva el mensaje, el mensaje no se puede resolver al volver a conectar el vínculo. Los vínculos se pueden desasociar debido a un error de red transitorio a corto plazo, una interrupción de la red o debido al tiempo de espera de inactividad de 10 minutos aplicado al servicio. La reconexión del vínculo se produce automáticamente como parte de cualquier operación que requiera el vínculo, es decir, establecer o recibir mensajes. Debido a este comportamiento, es posible que se encuentre ServiceBusException con Reason de MessageLockLost o SessionLockLost aunque aún no haya pasado el tiempo de expiración del bloqueo.

    • SessionLockLost: indica que el bloqueo de la sesión expiró. Los autores de llamadas deben intentar aceptar la sesión de nuevo. Esta excepción solo se aplica a las entidades habilitadas para sesión. Este error se produce si el procesamiento tarda más tiempo que la duración del bloqueo y el bloqueo de sesión no se renueva. Este error también puede producirse cuando el vínculo se desasocia debido a un problema de red transitorio o cuando el vínculo está inactivo durante 10 minutos. El servicio Service Bus usa el protocolo AMQP, que es con estado. Debido a la naturaleza del protocolo, si el vínculo que conecta el cliente y el servicio se desasocia después de recibir un mensaje, pero antes de que se resuelva el mensaje, el mensaje no se puede resolver al volver a conectar el vínculo. Los vínculos se pueden desasociar debido a un error de red transitorio a corto plazo, una interrupción de la red o debido al tiempo de espera de inactividad de 10 minutos aplicado al servicio. La reconexión del vínculo se produce automáticamente como parte de cualquier operación que requiera el vínculo, es decir, establecer o recibir mensajes. Debido a este comportamiento, es posible que se encuentre ServiceBusException con Reason de MessageLockLost o SessionLockLost aunque aún no haya pasado el tiempo de expiración del bloqueo.

    • MessageNotFound: este error se produce al intentar recibir un mensaje diferido por número de secuencia para un mensaje que no existe en la entidad o está bloqueado actualmente.

    • SessionCannotBeLocked: indica que la sesión solicitada no se puede bloquear porque el bloqueo ya se mantiene en otro lugar. Una vez que expire el bloqueo, se puede aceptar la sesión.

    • GeneralError: indica que el servicio de Service Bus encontró un error al procesar la solicitud. Este error suele deberse a actualizaciones y reinicios del servicio. Estos errores son errores transitorios que se reintentan automáticamente.

    • ServiceCommunicationProblem: indica que se ha producido un error al comunicarse con el servicio. El problema puede derivar de un problema de red transitorio o de un problema de servicio. Estos errores son errores transitorios que se reintentarán automáticamente.

    • ServiceBusy: indica que el servicio limitó una solicitud. Los detalles que describen qué puede hacer que una solicitud se limite y cómo evitar que se limite se pueden encontrar aquí. Las solicitudes limitadas se reintentan, pero la biblioteca cliente aplica automáticamente un retroceso de 10 segundos antes de intentar más solicitudes con el mismo ServiceBusClient (o cualquier subtipo creado a partir de ese cliente). Puede causar problemas si la duración del bloqueo de su entidad es inferior a 10 segundos, ya que es probable que se pierdan los bloqueos de mensajes o sesiones para los mensajes anulados o las sesiones bloqueadas. Dado que las solicitudes limitadas normalmente se vuelven a intentar correctamente, las excepciones generadas se registrarían como advertencias en lugar de errores: el evento de origen de eventos de nivel de advertencia específico es 43 (RunOperation encontró una excepción y se reintenta.).

    • MessagingEntityAlreadyExists: indica que existe una entidad con el mismo nombre en el mismo espacio de nombres.

    • MessagingEntityDisabled: la entidad Messaging está deshabilitada. Vuelva a habilitar la entidad mediante el portal.

    • MessagingEntityNotFound: el servicio Service Bus no encuentra un recurso de Service Bus.

Control de ServiceBusException: ejemplo

Este es un ejemplo de cómo controlar un ServiceBusException y filtrar por el Reason.

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

Otras excepciones comunes

  • ArgumentException: el cliente produce esta excepción derivada de ArgumentException cuando un parámetro proporcionado al interactuar con el cliente no es válido. Puede encontrar información sobre el parámetro específico y la naturaleza del problema en el Message.
  • InvalidOperationException: se produce al intentar realizar una operación que no es válida para su configuración actual. Esta excepción suele producirse cuando un cliente no se configuró para admitir la operación. A menudo, se puede mitigar ajustando las opciones que se pasan al cliente.
  • NotSupportedException: se produce cuando una operación solicitada es válida para el cliente, pero no es compatible con su estado actual. Puede encontrar información sobre el escenario en el Message.
  • AggregateException: se produce cuando una operación puede encontrar varias excepciones y las muestra como un único error. Esta excepción se encuentra normalmente al iniciar o detener el procesador de Service Bus o el procesador de sesión de Service Bus.

Motivo: QuotaExceeded

ServiceBusException con el motivo establecido en QuotaExceeded indica que se ha superado una cuota para una entidad específica.

Nota:

Para ver las cuotas de Service Bus, consulte Cuotas.

Colas y temas

Para las colas y los temas, suele tratarse del tamaño de la cola. La propiedad de mensaje de error contiene más detalles, como en el ejemplo siguiente:

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

El mensaje indica que el tema superaba su límite de tamaño, en este caso 1 GB (el límite de tamaño predeterminado).

Espacios de nombres

Para espacios de nombres, la excepción QuotaExceeded puede indicar que una aplicación ha superado el número máximo de conexiones en un espacio de nombres. Por ejemplo:

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

Causas comunes

Hay dos causas comunes de este error: la cola de mensajes fallidos y receptores de mensajes que no funcionan.

  • Cola de mensajes fallidos Un lector no puede completar los mensajes, que se devuelven a la cola o tema al expirar el bloqueo. Puede ocurrir si el lector encuentra una excepción que impide que complete el mensaje. Una vez que un mensaje se ha leído 10 veces, se mueve a la cola de mensajes fallidos de forma predeterminada. La propiedad MaxDeliveryCount controla este comportamiento, que tiene un valor predeterminado de 10. Al acumularse los mensajes en la cola de mensajes fallidos, estos ocupan espacio.

    Para resolver el problema, lea y complete los mensajes de la cola de mensajes fallidos, igual que haría si se encontraran en cualquier otra cola.

  • Receptor detenido. Un receptor ha dejado de recibir mensajes de una cola o suscripción. La manera de identificar el problema es examinar el recuento de mensajes activos. Si el recuento de mensajes activos es alto o creciente, los mensajes no se leen tan rápido como se escriben.

Motivo: MessageLockLost

Causa

ServiceBusException con el motivo establecido en MessageLockLost indica que se recibe un mensaje mediante el modo de recepción PeekLock y el bloqueo mantenido por el cliente expira en el lado del servicio.

El bloqueo de un mensaje puede expirar debido a varios motivos:

  • El temporizador de bloqueo ha expirado antes de que la aplicación cliente lo renovara.
  • La aplicación cliente adquirió el bloqueo, lo guardó en un almacén persistente y luego se reinició. Una vez que se reinició, la aplicación cliente examinó los mensajes en proceso e intentó completarlos.

También puede recibir esta excepción en los escenarios siguientes:

  • Actualización del servicio
  • Actualización del sistema operativo
  • Al cambiar las propiedades de la entidad (cola, tema, suscripción) mientras se mantiene el bloqueo.

Solución

Cuando una aplicación cliente recibe MessageLockLostException, ya no puede procesar el mensaje. De manera opcional, la aplicación cliente puede considerar registrar la excepción para su análisis, pero el cliente debe eliminar el mensaje.

Dado que el bloqueo del mensaje ha expirado, volvería a la cola (o suscripción), y la siguiente aplicación cliente que llame a Receive podría procesarlo.

Si se ha superado MaxDeliveryCount, el mensaje puede moverse a DeadLetterQueue.

Motivo: SessionLockLost

Causa

ServiceBusException con el motivo establecido en MessageLockLost se produce cuando se acepta una sesión y el bloqueo que mantiene el cliente expira en el lado del servicio.

El bloqueo de una sesión puede expirar debido a varios motivos:

  • El temporizador de bloqueo ha expirado antes de que la aplicación cliente lo renovara.
  • La aplicación cliente adquirió el bloqueo, lo guardó en un almacén persistente y luego se reinició. Una vez que se reinició, la aplicación cliente examinó las sesiones en proceso e intentó procesar los mensajes de esas sesiones.

También puede recibir esta excepción en los escenarios siguientes:

  • Actualización del servicio
  • Actualización del sistema operativo
  • Al cambiar las propiedades de la entidad (cola, tema, suscripción) mientras se mantiene el bloqueo.

Solución

Cuando una aplicación cliente recibe SessionLockLostException, ya no puede procesar los mensajes en la sesión. La aplicación cliente puede considerar registrar la excepción para su análisis, pero el cliente debe eliminar el mensaje.

Dado que el bloqueo de la sesión ha expirado, volvería a la cola (o suscripción), y la siguiente aplicación cliente que acepte la sesión podría bloquearla. Dado que una única aplicación cliente mantiene el bloqueo de la sesión en un momento dado, el procesamiento en orden está garantizado.

TimeoutException

TimeoutException indica que la operación iniciada por el usuario está superando el tiempo de espera.

Debe comprobar el valor de la propiedad ServicePointManager.DefaultConnectionLimit, porque si alcanza este límite también puede causar una excepción TimeoutException.

Se espera que se produzcan tiempos de espera durante o entre operaciones de mantenimiento, como por ejemplo durante las actualizaciones del servicio Service Bus (o) actualizaciones del sistema operativo en los recursos que ejecutan el servicio. Durante las actualizaciones del sistema operativo, las entidades se mueven alrededor de los nodos y se actualizan o se reinician, lo que puede provocar tiempos de espera. Para obtener detalles sobre el contrato de nivel de servicio (SLA) para el servicio Azure Service Bus, consulte SLA para Service Bus.

SocketException

Causa

SocketException se produce en los casos siguientes:

  • Cuando se produce un error en un intento de conexión porque el host no respondió correctamente después de un tiempo especificado (código de error de TCP 10060).
  • Hubo un error en una conexión establecida porque el host conectado no respondió.
  • Hubo un error al procesar el mensaje o el host remoto superó el tiempo de espera.
  • Problema de recursos de red subyacentes.

Solución

Los errores SocketException indican que la VM que hospeda las aplicaciones no puede convertir el nombre <mynamespace>.servicebus.windows.net en la dirección IP correspondiente.

Compruebe si el comando siguiente logra una asignación a una dirección IP.

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

Lo que proporcionaría una salida como la siguiente:

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

Si el nombre anterior no se resuelve en una dirección IP y en el alias del espacio de nombres, pida al administrador de red que investigue. La resolución de nombres se realiza a través de un servidor DNS, normalmente un recurso de la red del cliente. Si la resolución de DNS se realiza mediante Azure DNS, póngase en contacto con Soporte técnico de Azure.

Si la resolución de nombres funciona según lo previsto, compruebe aquí si se permite la conexión a Azure Service Bus.

UnauthorizedAccessException

Un UnauthorizedAccessException indica que las credenciales proporcionadas no permiten que se realice la acción solicitada. La propiedad Message contiene detalles sobre el error.

Se recomienda seguir estos pasos de comprobación, en función del tipo de autorización proporcionado al construir el ServiceBusClient.

Excepciones de replicación geográfica

ServerBusyException

Causas

  • Durante la replicación asincrónica (retardo de replicación superior a cero), el cliente prueba a realizar una operación en una entidad de Service Bus (cola, tema) o realiza una operación de administración, pero la operación no puede finalizarse porque el retardo de replicación entre las regiones primaria y secundaria ha superado el retardo de replicación máximo permitido en segundos.
    • Ejemplo: La operación se limita porque con ella el nuevo retardo de replicación alcanzaría los 38 323 segundos, que es mayor que el retardo de replicación máximo que se había establecido (300 segundos). El retraso de replicación actual para la operación más reciente que se replica es de 0 segundos.
  • La cola de replicación de una entidad supera su tamaño máximo en bytes. El tamaño máximo en bytes para una cola de replicación es un límite interno establecido por Service Bus.
    • Ejemplo: el tamaño de la cola de replicación 73128000 ha superado el umbral 67108864.
  • En la replicación sincrónica, una solicitud agota el tiempo de espera mientras espera a que se replique otra solicitud.
    • Ejemplo: elevado volumen de solicitudes de la aplicación cliente para skarri-storage-exp1(westus3)/q1:MessagingJournal. La replicación en otras regiones está en curso.

Solución

  • El cliente debe volver a desactivarse para dar tiempo al servicio para procesar su carga de trabajo determinada y, a continuación, el cliente debe reintentar.

Tiempo de espera

Causa

  • Una excepción de tiempo de espera en recuperación ante desastres geográfica significa que la operación no se completó dentro del tiempo de espera proporcionado por el cliente.
    • En la replicación sincrónica, la escritura y replicación de la región primaria de una operación en regiones secundarias se encuentran dentro del ámbito del tiempo de espera de la operación.
    • En la replicación asincrónica, la escritura de la región primaria de una operación está dentro del ámbito del tiempo de espera de la operación, pero la replicación de una operación en regiones secundarias no está dentro del ámbito del tiempo de espera de la operación.
    • Ejemplo: La operación no ha finalizado en el tiempo asignado de 00:01:00 para el mensaje de objeto. (ServiceTimeout).

Solución

  • El cliente debería reintentar la operación.
  • Es posible que se hayan completado algunos pasos de una operación con tiempo de espera agotado. Es posible que se haya escrito una operación con tiempo de espera agotado en la región primaria y en algunas regiones secundarias. Si se ha escrito una operación en la región primaria, finalmente se replicará en todas las regiones secundarias, independientemente del tiempo de espera del cliente.

BadRequest

Causa

  • Durante una conmutación por error planeada, la región primaria se establece temporalmente como de solo lectura para permitir que la región secundaria se ponga al día. Si el cliente intenta realizar una operación de escritura en la región primaria mientras se encuentra en este estado temporal de solo lectura, el cliente recibirá una excepción BadRequest.
    • Ejemplo: el modificador de rol de replicación en curso, réplica principal: <entity-name> es ReadOnly.

Solución

  • El cliente debe esperar a que finalice la conmutación por error planeada para que las operaciones de escritura se realicen correctamente.
  • En caso de que la conmutación por error planeada tarde demasiado tiempo, es posible desencadenar una conmutación por error forzada en su lugar.

Pasos siguientes

Para obtener la referencia completa de la API de .NET para Service Bus, consulte la referencia de la API de .NET de Azure. Para obtener consejos de solución de problemas, consulte la Guía de solución de problemas.