Operaciones de limitación en Azure Service Bus

Las soluciones nativas en la nube ofrecen una apariencia de recursos ilimitados que se pueden escalar con la carga de trabajo. Aunque esta apariencia es más real en la nube que en los sistemas locales, existen límites en la nube. Estos límites pueden provocar la limitación de las solicitudes de las aplicaciones cliente en los niveles estándar y prémium, como se analiza en este artículo.

Limitación en el nivel Estándar

El nivel estándar de Service Bus funciona como una instalación multiinquilino con un modelo de precios de pago por uso. Aquí hay varios espacios de nombres en el mismo clúster que comparten los recursos asignados. El nivel Estándar es la opción recomendada para entornos de desarrollo, entornos de control de calidad y los sistemas de producción de bajo rendimiento.

En el pasado, Service Bus tenía límites amplios que dependían estrictamente del uso de los recursos. Sin embargo, existe la oportunidad de refinar la lógica de limitación y proporcionar un comportamiento de limitación predecible para todos los espacios de nombres que comparten estos recursos.

En un intento de garantizar el uso y la distribución equitativos de los recursos en todos los espacios de nombres estándar de Service Bus que usan los mismos recursos, el nivel estándar de Service Bus usa actualmente la lógica de limitación basada en crédito.

Nota:

Es importante tener en cuenta que la limitación no es algo nuevo para Azure Service Bus o cualquier otro servicio nativo en la nube.

La limitación basada en créditos simplemente está refinando la manera en que varios espacios de nombres comparten recursos en un entorno multiinquilino de nivel Estándar permitiendo así un uso equitativo por parte de todos los espacios de nombres que comparten los recursos.

¿Qué son las limitaciones basadas en créditos?

Las limitaciones basadas en créditos limitan el número de operaciones que se pueden realizar en un espacio de nombres determinado en un período de tiempo concreto. A continuación, se muestra el flujo de trabajo de una limitación basada en créditos.

  • Al comienzo de cada período de tiempo, Service Bus proporciona algunos créditos a cada espacio de nombres.
  • Todas las operaciones realizadas por las aplicaciones cliente del emisor o del receptor se cuentan con estos créditos (y se restarán de los créditos disponibles).
  • Si se agotan los créditos, las operaciones subsiguientes se limitarán hasta el inicio del período de tiempo siguiente.
  • Los créditos se reponen al principio del siguiente período de tiempo.

¿Cuáles son los límites de créditos?

Los límites de créditos se establecen actualmente en 1000 créditos cada segundo (por espacio de nombres). No todas las operaciones se crean igual. Estos son los costos en créditos de cada una de las operaciones.

Operación Costo en créditos
Operaciones de datos (Send, SendAsync, Receive, ReceiveAsync y Peek) 1 crédito por mensaje
Operaciones de administración (Create, Read, Update y Delete en colas, temas, suscripciones y filtros) 10 créditos

Nota

Al realizar el envío a un tema, cada mensaje se evalúa con respecto a los filtros antes de que esté disponible en la suscripción. Cada evaluación mediante filtros también cuenta con el límite de crédito (es decir, un crédito por evaluación de filtro).

¿Cómo sé que estoy limitado?

Cuando las solicitudes de las aplicaciones cliente se limitan, la aplicación cliente recibe la siguiente respuesta del servidor.

The request was terminated because the entity is being throttled. Error code: 50009. Please wait 2 seconds and try again.

¿Cómo puedo evitar la limitación?

Con los recursos compartidos, es importante aplicar algún tipo de uso equitativo en varios espacios de nombres de Service Bus que compartan esos recursos. La limitación garantiza que cualquier pico de una carga de trabajo no provoque que se limiten otras cargas de trabajo en los mismos recursos. Como se menciona más adelante en el artículo, no hay ningún riesgo en experimentar una limitación porque los kits de desarrollo de software (SDK) de cliente (y otras ofertas de PaaS de Azure) tienen la directiva de reintentos predeterminada integrada. Cualquier solicitud limitada se vuelve a intentar con retroceso exponencial y se termina de realizar cuando se reponen los créditos.

Es comprensible que algunas aplicaciones sean más sensibles a las limitaciones. En ese caso, se recomienda migrar el espacio de nombres actual de Service Bus de estándar a prémium. Tras la migración, puede asignar recursos dedicados al espacio de nombres de Service Bus y escalar verticalmente los recursos de manera adecuada si hay un pico en la carga de trabajo y reducir así la probabilidad de que se limiten. Además, cuando la carga de trabajo se reduce a niveles normales, puede reducir verticalmente los recursos asignados al espacio de nombres.

Limitación en el nivel Premium

El nivel Premium de Service Bus asigna recursos dedicados, en términos de unidades de mensajería, a cada espacio de nombres configurado por el cliente. Estos recursos dedicados proporcionan una latencia y un rendimiento predecibles y se recomiendan para sistemas de producción de alto rendimiento o confidenciales. Además, el nivel Premium también permite a los clientes escalar verticalmente su capacidad de rendimiento si experimentan picos en la carga de trabajo. Para obtener más información, consulte Actualización automática de las unidades de mensajería de un espacio de nombres de Azure Service Bus.

¿Cómo funciona la limitación en el nivel Prémium de Service Bus?

Con la asignación de recursos exclusiva del nivel Premium, la limitación se rige únicamente por las limitaciones de los recursos asignados al espacio de nombres. Si el número de solicitudes es mayor de lo que los recursos actuales pueden atender, se limitan las solicitudes.

¿Cómo sé que estoy limitado?

Hay varias maneras de identificar una limitación en el nivel Premium de Service Bus.

  • Las solicitudes limitadas aparecen en las métricas de solicitudes de Azure Monitor para identificar el número de solicitudes que se han limitado.
  • Un uso elevado de la CPU indica que la asignación de recursos actual es alta y que se pueden limitar las solicitudes si la carga de trabajo actual no se reduce.
  • Un uso elevado de la memoria indica que la asignación de recursos actual es alta y que se pueden limitar las solicitudes si la carga de trabajo actual no se reduce.

¿Cómo puedo evitar la limitación?

Como el espacio de nombres del nivel Premium de Service Bus ya tiene recursos dedicados, puede reducir la posibilidad de experimentar una limitación mediante el escalado vertical del número de unidades de mensajería asignadas al espacio de nombres en caso de (o en previsión de) un pico en la carga de trabajo. Para obtener más información, consulte Actualización automática de las unidades de mensajería de un espacio de nombres de Azure Service Bus.

Preguntas más frecuentes

¿Cómo afecta la limitación a mi aplicación?

Cuando una solicitud está limitada, eso implica que el servicio está ocupado porque está recibiendo más solicitudes de las que permiten los recursos. Si se vuelve a intentar la misma operación transcurridos unos minutos, una vez que el servicio haya finalizado las operaciones con la carga de trabajo actual, se podrá atender la solicitud.

Dado que la limitación es un comportamiento previsible en cualquier servicio nativo en la nube, la lógica de reintento se encuentra integrada en el propio SDK de Service Bus. El valor predeterminado se establece en el reintento automático con retroceso exponencial para asegurarse de que no se limita siempre la misma solicitud. La lógica de reintento predeterminada se aplica a todas las operaciones.

Nota:

El código de procesamiento de mensajes que llama a otros servicios de terceros también podría estar limitado por esos otros servicios. Para obtener más información sobre cómo controlar estos escenarios, consulte la documentación sobre el patrón de limitación.

¿La limitación provoca la pérdida de datos?

Azure Service Bus está optimizado para la persistencia. Garantizamos que todos los datos enviados a Service Bus se almacenan antes de que el servicio confirme la correcta finalización de la solicitud.

Una vez que Service Bus confirma correctamente la solicitud, eso significa que la ha procesado correctamente. Si Service Bus devuelve un error, eso significa que Service Bus no ha podido procesar la solicitud y que la aplicación cliente debe reintentar la solicitud.

Sin embargo, cuando se limita una solicitud, el servicio entiende que no puede aceptar y procesar la solicitud en este momento debido a las limitaciones de los recursos. Esto no conlleva ningún tipo de pérdida de datos porque Service Bus simplemente no ha examinado la solicitud. En este caso, confiar en la directiva de reintentos predeterminada del SDK de Service Bus garantiza que la solicitud se procesará realmente.

Para más información y ejemplos de cómo usar la mensajería de Service Bus, consulte estos temas avanzados: