Preparación para la Certificación Microsoft AI-200
Bus de Servicio de Azure: colas, temas, suscripciones y mensajería de IA confiable
Desacopla la recepción de solicitudes de la latencia variable de inferencia mediante nivelación de carga, consumidores competidores, fan-out filtrado, mensajes estructurados, claim check, liquidación Peek-Lock, idempotencia, renovación de bloqueo y recuperación observable de mensajes fallidos.
Tiempo de estudio sugerido: 125 minutos • Nivel intermedio • Reescritura original completa con versión resumida de cada tema, evaluación comentada y laboratorio guiado en Python
Por João Ricardo Dutra••Contenido original completo
1. Escenario de mensajería para IA y objetivos
Imagina una de análisis de documentos cuya inferencia tarda desde unos segundos hasta medio minuto. El tráfico llega en ráfagas, pocos procesadores pueden usar el modelo a la vez y los servicios de notificación, auditoría, métricas y calidad necesitan el resultado. Una cadena sincrónica prolonga la espera, exige disponibilidad simultánea y permite que una entrada lenta o no válida consuma capacidad.
de incorpora un agente duradero entre los componentes. La confirma rápidamente la aceptación, los workers vacían el trabajo a un ritmo controlado y los consumidores posteriores reciben copias independientes. Una entrada problemática permanece disponible para diagnóstico.
Aplicar nivelación de carga, consumidores competidores, desacoplamiento temporal y publicación/suscripción a IA.
Elegir colas o temas con suscripciones, sesiones y filtros en el agente.
Diseñar cuerpos , propiedades, correlación, lotes, expiración y check.
Procesar con Peek-Lock, liquidación explícita, idempotencia, renovación de bloqueo y recuperación de DLQ.
Probar el flujo en Python con -servicebus y .
Resumen del tema
El agente separa la aceptación rápida del procesamiento variable de IA y ofrece una ruta operativa explícita para entregas, reintentos y errores.
2. Espacios de nombres, entidades, protocolos e identidad
es un agente de mensajes empresarial completamente administrado. El es el límite administrativo y de red que contiene colas, temas y suscripciones y expone un punto de conexión como <>.servicebus.windows.net. AMQP 1.0 es el protocolo principal de los modernos y admite liquidación, transacciones, controles de orden y detección de duplicados.
Los clientes pueden usar SAS o . Para cargas en , prefiere una y el rol de datos más limitado: Data Sender, Data Receiver o . Así se evitan cadenas de conexión incrustadas; después de migrar todos los clientes, se puede deshabilitar la autenticación local.
Bloques fundamentales
Elemento
Responsabilidad
Define entidades, punto de conexión, nivel, capacidad, red, diagnóstico y autenticación
Cola
Conserva trabajo para procesamiento punto a punto o por consumidores competidores
Tema
Acepta una publicación y distribuye copias coincidentes
Suscripción
Actúa como cola virtual independiente y admite reglas y filtros
Cliente AMQP 1.0
Envía, recibe, bloquea y liquida mensajes mediante el
Resumen del tema
Trata el como frontera de seguridad y capacidad, elige las entidades correctas y usa con privilegio mínimo.
3. Desacopla la recepción de solicitudes de la inferencia
En una solicitud-respuesta asincrónica, la valida el sobre, guarda el estado, envía el mensaje y devuelve un identificador de operación. Después, un worker recibe, ejecuta la inferencia, persiste el resultado y publica un evento o permite que el cliente consulte. Productor y consumidor ya no dependen del mismo momento de implementación y escalado.
La arquitectura no elimina la latencia: la vuelve visible y controlable. El producto debe representar los estados aceptado, en ejecución, completado, con error y expirado, proteger la consulta de estado y definir y notificación. La cola no sustituye a la base de datos de resultados.
Resumen del tema
La mensajería asincrónica convierte una inferencia larga en una operación rastreable con estado y resultado persistentes.
4. Nivela la carga con una cola duradera
La nivelación absorbe una ráfaga corta en la cola mientras un grupo estable de workers consume al rendimiento sostenible. Protege GPU, memoria y puntos de conexión de modelo limitados y evita mantener cómputo para un pico poco frecuente.
La cola todavía requiere capacidad y supervisión. Un trabajo pendiente creciente aumenta la demora y puede perder valor empresarial. Define capacidad, , alertas y umbrales de escalado con tasas de llegada y proceso, antigüedad aceptable y errores. Haz visible la contrapresión a los llamadores.
Diagrama original: la cola duradera suaviza las ráfagas de la y distribuye mensajes entre workers de IA con escalado independiente.
Resumen del tema
Usa la cola como búfer controlado entre demanda irregular y capacidad finita, con límites de tamaño y antigüedad.
5. Escala con consumidores competidores y desacoplamiento temporal
Varias instancias reciben de la misma cola. bloquea cada mensaje para un receptor a la vez y distribuye el trabajo sin un despachador central. , o pueden agregar instancias cuando crece el trabajo pendiente.
Si un worker falla antes de liquidar, el bloqueo expira y el mensaje vuelve a estar disponible. Esa recuperación admite duplicados, por lo que los efectos posteriores deben ser idempotentes. El almacenamiento duradero también conserva trabajo durante una implementación o interrupción breve.
Resumen del tema
Los consumidores competidores distribuyen trabajo horizontalmente; el almacenamiento duradero desacopla disponibilidad y la idempotencia hace segura la reentrega.
6. Usa la profundidad como contrapresión y señal de escalado
Mensajes activos, antigüedad del más antiguo, tasas de entrada y finalización, latencia, errores y mensajes fallidos describen mejor la salud que la CPU aislada. Crecimiento continuo indica que la llegada supera la finalización; una cola siempre vacía puede significar poca latencia o exceso de capacidad.
recopila métricas y activa alertas. KEDA en o y los desencadenadores de convierten el trabajo pendiente en réplicas. Configura mínimos, máximos, enfriamiento, concurrencia y límites del modelo en conjunto para no trasladar el cuello de botella.
Resumen del tema
Dimensiona con profundidad, antigüedad, rendimiento y límites posteriores; la profundidad es una señal, no el plan completo.
7. Elige Standard o Premium y respeta los límites
Decisiones de nivel
Aspecto
Standard
Premium
Capacidad
Infraestructura compartida
Unidades de mensajería dedicadas y mayor aislamiento
Colas, temas y suscripciones
Compatibles
Compatibles
Mensaje único
256 KB
1 MB de forma predeterminada; hasta 100 MB por entidad mediante AMQP si se configura
/SBMP
Dentro del límite del nivel
Hasta 1 MB por mensaje
256 KB
Hasta 1 MB incluso con mensajes grandes habilitados
Red y resistencia
Controles esenciales
Puntos de conexión privados, opciones de red virtual y zonas donde estén disponibles
La cuota incluye cuerpo y propiedades y varía por nivel, protocolo y configuración; consulta la documentación vigente. Documentos, imágenes, audio y artefactos suelen pertenecer a mediante check aunque un mensaje grande sea técnicamente posible.
Resumen del tema
Elige el nivel por aislamiento, red, disponibilidad y rendimiento medido; usa las cuotas como límites de validación.
8. Elige cola o tema con suscripciones
Selección de entidad
Necesidad
Usa
Motivo
Un worker procesa cada solicitud
Cola
Los consumidores comparten un flujo
Varios servicios necesitan el mismo resultado
Tema + suscripciones
Cada suscripción coincidente recibe una copia
Un productor y una responsabilidad
Cola
Ciclo de vida más sencillo
Notificación, auditoría, métricas y calidad
Tema + suscripciones
Escala y errores independientes
Agregar consumidores sin cambiar el publicador
Tema + suscripciones
El publicador usa un tema estable
El receptor no lee directamente del tema: consume una suscripción que actúa como cola virtual y también puede tener consumidores competidores. No uses tres consumidores en una cola cuando los tres deban ver el mensaje; solo uno lo recibirá.
Resumen del tema
Usa cola para una responsabilidad y tema con suscripciones cuando varias responsabilidades necesiten copias independientes.
9. Conserva el orden por flujo con sesiones
El orden de llegada no garantiza finalización ordenada con varios workers. Las sesiones agrupan por session_id y conceden un bloqueo exclusivo, ofreciendo FIFO en el grupo y paralelismo entre grupos. Extraer, clasificar y resumir puede compartir el identificador del documento.
La entidad debe crearse con sesiones y cada mensaje debe llevar session_id. Las sesiones reducen concurrencia para claves activas y agregan estado; úsalas solo cuando el orden sea requisito de corrección. Un orquestador puede ser más claro para dependencias complejas.
Resumen del tema
Las sesiones ofrecen proceso exclusivo y ordenado por clave empresarial, manteniendo paralelismo entre claves.
10. Distribuye resultados con filtros de suscripción
Cada suscripción comienza con TrueFilter y acepta todo. Sustitúyelo o complétalo con filtros SQL sobre propiedades de sistema y aplicación; los filtros de correlación son eficientes para coincidencias exactas. FalseFilter no acepta mensajes y ayuda cuando todas las reglas serán explícitas.
Propiedades como priority, model_name, document_type, tenant y review_required permiten enrutar sin analizar . Estabiliza nombres y tipos, prueba reglas superpuestas y elimina la regla verdadera predeterminada si anula la selección. El filtro controla entrega, no autorización.
Diagrama original: una publicación genera copias independientes para notificación, auditoría, métricas y calidad según reglas del agente.
Resumen del tema
Enruta publicaciones con propiedades estables y reglas probadas; cada suscripción conserva su propio trabajo pendiente, reintentos, escalado y errores.
11. Administra remitentes y receptores con el de Python
El paquete -servicebus proporciona ServiceBusClient, remitentes de cola/tema y receptores de cola/suscripción. Los administradores de contexto cierran vínculos AMQP de forma predecible. Reutiliza clientes y vínculos duraderos cuando corresponda y sigue la referencia actual porque las y versiones de Python evolucionan.
from azure.identity import DefaultAzureCredential
from azure.servicebus import ServiceBusClient, ServiceBusMessage
namespace = "<namespace>.servicebus.windows.net"
credential = DefaultAzureCredential()
with ServiceBusClient(namespace, credential) as client:
with client.get_queue_sender("inference-requests") as sender:
sender.send_messages(ServiceBusMessage(
'{"request_id":"req-917","model":"document-analyzer"}',
content_type="application/json",
message_id="req-917",
correlation_id="trace-6d13",
application_properties={"priority": "high"},
))
DefaultAzureCredential funciona con la identidad del desarrollador y con sin cambiar la lógica. Separa los roles Sender y Receiver. Usa get_topic_sender() para temas y get_subscription_receiver(topic_name, subscription_name) para suscripciones.
Resumen del tema
Trata los clientes como recursos administrados, reutiliza conexiones y autentica cada componente con una identidad limitada.
12. Estructura cuerpos y propiedades de mensajes de IA
El mensaje contiene cuerpo, propiedades de aplicación y propiedades del sistema. es apropiado para request_id, modelo, temperature, max_tokens y referencias de entrada. Define content_type como application/ y versiona el contrato para rechazar o transformar incompatibilidades conscientemente.
Ubicación correcta
Lugar
Ejemplos
Finalidad
Cuerpo
Referencia a documento o prompt, parámetros y entrada
Valida esquema, rangos, modelos permitidos, y autorización antes de inferencia costosa. No guardes secretos en cuerpo o propiedades; ambos cuentan para la cuota y pueden ser visibles a operadores autorizados.
Resumen del tema
Mantén el contrato versionado en el cuerpo, valores ligeros de enrutamiento en propiedades y la semántica de entrega en propiedades del sistema.
13. Correlaciona, rastrea, deduplica y procesa con idempotencia
message_id identifica el mensaje y alimenta la detección de duplicados durante la ventana configurada. correlation_id conecta , cola, inferencia, publicación y registros. Para OpenTelemetry, propaga traceparent y tracestate en propiedades de aplicación.
La detección protege reenvíos con el mismo message_id, pero no evita una reentrega después de error del receptor o liquidación ambigua. Registra un identificador empresarial en almacenamiento duradero y haz que escrituras, notificaciones y cobros toleren repeticiones. Peek-Lock sigue ofreciendo al menos una entrega; la idempotencia permite un efecto empresarial efectivo una sola vez.
Resumen del tema
Usa message_id contra reenvíos, correlación y trazas para observabilidad e idempotencia duradera contra reentregas.
14. Aplica check a cargas grandes
Un documento de 500 MB no cabe en un mensaje y las cargas grandes permitidas reducen rendimiento. Carga el documento en privado y publica una referencia opaca con , tamaño, tipo, modelo e identificadores. El worker autorizado recupera y comprueba el objeto.
# 1. Upload the large document to private Azure Blob Storage.
blob_uri = upload_with_managed_identity(document_bytes)
# 2. Send only the claim check and routing metadata.
message = ServiceBusMessage(
json.dumps({
"request_id": request_id,
"blob_uri": blob_uri,
"sha256": payload_hash,
"model": "document-analyzer",
}),
content_type="application/json",
message_id=request_id,
correlation_id=correlation_id,
)
sender.send_messages(message)
# 3. The authorized consumer retrieves, validates, and processes the blob.
Prefiere y red privada; si necesitas SAS, limita alcance y duración. Define propiedad, retención, reintento y eliminación para evitar blobs huérfanos o entradas borradas antes de una repetición. check también separa contenido sensible de intermediarios.
Resumen del tema
Guarda entradas grandes o sensibles en almacenamiento protegido y envía una referencia pequeña y verificable con ciclo de vida coordinado.
15. Controla vigencia con y rendimiento con lotes
time_to_live expresa cuánto tiempo sigue siendo útil el trabajo. Una recomendación en tiempo real puede expirar pronto; un análisis por lotes, más tarde. Los mensajes expirados pueden pasar a la cola de mensajes fallidos si se habilita esa opción. Los mensajes aplazados tienen comportamiento especial y no deben usarse como almacenamiento permanente.
ServiceBusMessageBatch agrupa mensajes hasta el límite calculado. Si add_message no admite el siguiente, envía el lote, crea otro y vuelve a agregarlo. Un mensaje individual grande todavía requiere check. El lote reduce viajes de red, pero no crea una sola transacción empresarial.
from azure.servicebus.exceptions import MessageSizeExceededError
batch = sender.create_message_batch()
for payload in payloads:
message = ServiceBusMessage(json.dumps(payload))
try:
batch.add_message(message)
except MessageSizeExceededError:
sender.send_messages(batch)
batch = sender.create_message_batch()
batch.add_message(message)
if len(batch) > 0:
sender.send_messages(batch)
Resumen del tema
Define por utilidad empresarial y agrupa mensajes pequeños hasta el límite del sin confundir lote de transporte y transacción.
16. Recibe con Peek-Lock y liquida deliberadamente
Recepción y liquidación
Opción
Efecto
Uso
Receive-and-
Elimina al entregar; un error puede perder trabajo
Telemetría no crítica
Peek-Lock
Bloquea y elimina solo después de complete
Predeterminado para inferencia importante
Complete
Éxito y eliminación definitiva
Tras completar efectos duraderos
Abandon
Libera para reintento e incrementa entregas
Error transitorio
Dead-letter
Mueve a DLQ con diagnóstico
Entrada permanentemente no válida
Defer
Conserva, pero exige sequence_number
Dependencia conocida u orden intencional
from azure.servicebus import ServiceBusReceiveMode
with client.get_queue_receiver(
queue_name="inference-requests",
receive_mode=ServiceBusReceiveMode.PEEK_LOCK,
max_wait_time=30,
) as receiver:
for message in receiver:
try:
payload = json.loads(str(message))
validate(payload)
process_idempotently(payload, str(message.message_id))
receiver.complete_message(message)
except PermanentPayloadError as error:
receiver.dead_letter_message(
message,
reason="InvalidPayload",
error_description=str(error),
)
except TransientDependencyError:
receiver.abandon_message(message)
Liquida solo después de los efectos duraderos. Un durante la liquidación es ambiguo: el agente puede haber aplicado la operación sin que el cliente reciba confirmación, otra razón para exigir idempotencia.
Resumen del tema
Peek-Lock prioriza recuperación: completa el éxito, abandona el error transitorio, envía el permanente a DLQ y aplaza solo con plan de recuperación.
17. Renueva bloqueos y opera la cola de mensajes fallidos
El bloqueo predeterminado dura un minuto y puede configurarse hasta cinco. Para procesamiento legítimo más largo, renuévalo o usa AutoLockRenewer durante un período limitado. Evita recibir o capturar previamente más mensajes de los que el worker puede terminar. Para tareas siempre largas, registra el trabajo, completa el mensaje pronto y usa una máquina de estados aparte.
from azure.servicebus import AutoLockRenewer
with AutoLockRenewer() as renewer:
with client.get_queue_receiver("inference-requests") as receiver:
for message in receiver:
renewer.register(
receiver,
message,
max_lock_renewal_duration=600,
)
run_long_inference(message)
receiver.complete_message(message)
Cada cola y suscripción tiene una DLQ. Al superar maxDeliveryCount —10 de forma predeterminada— el mensaje llega con MaxDeliveryCountExceeded; la aplicación también puede indicar motivo y descripción. La DLQ retiene mensajes hasta liquidación explícita. Alerta por cantidad y antigüedad, corrige la causa y luego reproduce mediante un proceso idempotente aprobado.
from azure.servicebus import ServiceBusSubQueue
with client.get_queue_receiver(
queue_name="inference-requests",
sub_queue=ServiceBusSubQueue.DEAD_LETTER,
max_wait_time=10,
) as dlq_receiver:
for message in dlq_receiver:
inspect(
message.dead_letter_reason,
message.dead_letter_error_description,
message.delivery_count,
message.correlation_id,
)
# Re-submit only after fixing the cause and preserving idempotency.
replay_if_approved(message)
dlq_receiver.complete_message(message)
Diagrama original: un mensaje bloqueado se completa, abandona, aplaza o envía a DLQ; solo se reproduce después de la reparación.
Resumen del tema
Renueva bloqueos para proceso largo acotado, controla intentos y trata la DLQ como flujo observable de reparación.
18. Laboratorio, evaluación y lista de producción
El ejercicio original crea un y una aplicación Flask en Python, usa una cola con Peek-Lock, inspecciona entrada no válida en DLQ y distribuye resultados a suscripciones filtradas. Reserva unos 30 minutos, una suscripción de ,, Python 3.12 o posterior y la actual.
az group create --name ai200-servicebus-rg --location eastus
az servicebus namespace create --resource-group ai200-servicebus-rg --name <globally-unique-namespace> --location eastus --sku Standard
az servicebus queue create --resource-group ai200-servicebus-rg --namespace-name <namespace> --name inference-requests --max-delivery-count 5
az servicebus topic create --resource-group ai200-servicebus-rg --namespace-name <namespace> --name inference-results
python -m venv .venv
python -m pip install --upgrade azure-identity azure-servicebus flask
Crea , cola, tema y suscripciones; configura intentos y filtros explícitamente.
Asigna roles Sender o Receiver a identidades administradas y usa DefaultAzureCredential.
Envía válido y un mensaje no válido; procesa el trabajo válido de forma idempotente con Peek-Lock.
Confirma la DLQ, corrige la causa y reproduce el mensaje una sola vez.
Publica un resultado con prioridad y demuestra que solo las suscripciones coincidentes lo reciben.
Observa trabajo pendiente, antigüedad, finalizaciones, reintentos, pérdida de bloqueo y DLQ; elimina los recursos al terminar.
Respuestas de evaluación
Pregunta
Respuesta
Motivo
Tres servicios necesitan cada resultado
Tema con tres suscripciones
Cada suscripción recibe una copia
Un error del worker no debe perder la solicitud
Peek-Lock
El trabajo no liquidado vuelve a estar disponible
El décimo error alcanza el límite
DLQ con MaxDeliveryCountExceeded
El agente aísla el mensaje problemático
Documento de 500 MB
check con
El agente lleva solo la referencia
Finalidad de correlation_id
Seguimiento de extremo a extremo
Conecta etapas, registros y resultado
Antes de producción, confirma nivel y cuotas, infraestructura como código, privilegio mínimo, autenticación local, red privada, validación del contrato, , ventana de duplicados, sesiones, filtros, almacén de idempotencia, bloqueo, prefetch, reintentos, propietario de DLQ, alertas, runbooks, coste y pruebas de carga en el modelo real.
El diseño completo combina entidad correcta, mensajes pequeños y versionados, identidad, filtros, correlación, Peek-Lock, idempotencia, control del bloqueo, recuperación observable de DLQ y prueba integral.