Envío de mensajes relacionados en orden mediante un convoy secuencial en Azure Logic Apps con Azure Service Bus
Se aplica a: Azure Logic Apps (consumo)
Cuando necesite enviar mensajes correlacionados en un orden específico, puede usar el patrón convoy secuencial al usar Azure Logic Apps mediante el conector de Azure Service Bus. Los mensajes correlacionados tienen una propiedad que define la relación entre esos mensajes, como el identificador de la sesión en Service Bus.
Por ejemplo, supongamos que tiene 10 mensajes para una sesión denominada "Session 1" y tiene 5 mensajes para una sesión denominada "Session 2" que se envían todos a la misma cola de Service Bus. Puede crear una aplicación lógica que procese los mensajes de la cola de modo que una sola ejecución del desencadenar se encargue de todos los mensajes de "Session 1" y la siguiente ejecución del desencadenador se encargue de todos los mensajes de "Session 2".
En este artículo se muestra cómo crear una aplicación lógica que implementa este patrón mediante la plantilla Entrega ordenada y correlacionada mediante sesiones de Service Bus. Esta plantilla define un flujo de trabajo de aplicación lógica que se inicia con el desencadenador Cuando se recibe un mensaje en una cola (bloque de inspección) del conector de Service Bus, que recibe mensajes de una cola de Service Bus. Estos son los pasos generales que realiza esta aplicación lógica:
Inicializar una sesión basada en un mensaje que lee el desencadenador de la cola de Service Bus.
Lea y procese todos los mensajes de la misma sesión en la cola durante la ejecución del flujo de trabajo actual.
Para revisar el archivo JSON de esta plantilla, consulte GitHub: service-bus-sessions.json.
Para obtener más información, consulte Patrón de convoy secuencial: patrones de diseño en la nube de arquitectura de Azure.
Requisitos previos
Suscripción a Azure. Si aún no tiene una, regístrese para obtener una cuenta de Azure gratuita.
Espacio de nombres de Service Bus y una cola de Service Bus, que es una entidad de mensajería que se usará en la aplicación lógica. Estos elementos y la aplicación lógica deben usar la misma suscripción de Azure. Asegúrese de seleccionar Habilitar sesiones al crear la cola. Si no tiene estos elementos, aprenda a crear el espacio de nombres de Service Bus y una cola.
Importante
Tenga cuidado al seleccionar un desencadenador y una acción que tengan el mismo tipo de conector y úselos para trabajar con la misma entidad, como una cola de mensajes o una suscripción a un tema. Esta combinación puede crear un bucle infinito, lo que da como resultado una aplicación lógica que nunca finaliza.
Conocimientos básicos acerca de cómo crear aplicaciones lógicas. Si no está familiarizado con Azure Logic Apps, consulte el inicio rápido sobre la creación de un ejemplo de flujo de trabajo de aplicación lógica de Consumo en Azure Logic Apps multiinquilino.
Comprobación del acceso al espacio de nombres de Service Bus
Si no está seguro de si la aplicación lógica tiene permisos de acceso a su espacio de nombres de Service Bus, confirme dichos permisos.
Inicie sesión en Azure Portal. Busque y seleccione el espacio de nombres de Service Bus.
En el menú del espacio de nombres, en Configuración, seleccione Directivas de acceso compartido. En Notificaciones, compruebe que tenga permisos de Administrador para ese espacio de nombres.
Ahora obtenga la cadena de conexión para el espacio de nombres de Service Bus. Puede usar esta cadena posteriormente cuando cree una conexión al espacio de nombres desde la aplicación lógica.
En el panel Directivas de acceso compartido, en Directiva, seleccione RootManageSharedAccessKey.
Al lado de la cadena de conexión principal, elija el botón de copia. Guarde la cadena de conexión para usarla más adelante.
Sugerencia
Para confirmar si la cadena de conexión está asociada al espacio de nombres de Service Bus o a una entidad de mensajería, como una cola, compruebe la cadena de conexión del parámetro
EntityPath
. Si encuentra este parámetro, la cadena de conexión es para una entidad específica y no es la correcta para la aplicación lógica.
Creación de la aplicación lógica
En esta sección, creará una aplicación lógica mediante la plantilla Entrega ordenada y correlacionada mediante sesiones de Service Bus, que incluye el desencadenador y las acciones para implementar este modelo de flujo de trabajo. También creará una conexión con el espacio de nombres de Service Bus y especificará el nombre de la cola de Service Bus que quiere usar.
En Azure Portal, cree una aplicación lógica en blanco. En la página principal de Azure, seleccione Crear un recurso>Integración>Aplicación lógica.
Después de que aparezca la galería de plantillas, desplácese más allá de las secciones de vídeo y desencadenadores comunes. En la sección Plantillas , seleccione la plantilla Entrega ordenada y correlacionada mediante sesiones de Service Bus.
Cuando aparezca el cuadro de confirmación, seleccione Usar esta plantilla.
En el Diseñador de aplicación lógica, en la forma Service Bus, seleccione continuar y, a continuación, seleccione el signo más (+) que aparece en la forma.
Ahora elija cualquiera de las dos opciones siguientes para crear una conexión de Service Bus:
Para usar la cadena de conexión que copió anteriormente del espacio de nombres de Service Bus, siga estos pasos:
Seleccione Especificar la información de conexión manualmente.
En Nombre de la conexión, especifique un nombre para la conexión. En Cadena de conexión, pegue la cadena de conexión del espacio de nombres y seleccione Crear, por ejemplo:
Sugerencia
Si no tiene esta cadena de conexión, obtenga información sobre cómo buscar y copiar la cadena de conexión del espacio de nombres de Service Bus.
Para seleccionar un espacio de nombres de Service Bus de la suscripción actual a Azure, siga estos pasos:
En Nombre de la conexión, especifique un nombre para la conexión. En Espacio de nombres de Service Bus, seleccione el espacio de nombres de Service Bus, por ejemplo:
Cuando aparezca el siguiente panel, seleccione la directiva de Service Bus y, luego, Crear.
Seleccione Continuar cuando haya terminado.
El Diseñador de aplicaciones lógicas ahora muestra la plantilla Entrega ordenada y correlacionada mediante sesiones de Service Bus, que contiene un flujo de trabajo previamente rellenado con un desencadenador y acciones, incluidos dos ámbitos que implementan control de errores que sigue el patrón
Try-Catch
.
Ahora puede obtener más información sobre el desencadenador y las acciones de la plantilla, o ir directamente a proporcionar los valores para la plantilla de aplicación lógica.
Resumen de plantilla
Este es el flujo de trabajo general en la plantilla Entrega ordenada y correlacionada mediante sesiones de Service Bus cuando se contraen los detalles:
Nombre | Descripción |
---|---|
When a message is received in a queue (peek-lock) |
En función de la periodicidad especificada, este desencadenador de Service Bus comprueba si hay mensajes en la cola de Service Bus especificada. Si existe algún mensaje en la cola, el desencadenador se activa para crear y ejecutar una instancia de flujo de trabajo. El término bloque de inspección significa que el desencadenador envía una solicitud para recuperar un mensaje de la cola. Si existe un mensaje, el desencadenador lo recupera y bloquea para que no se procese nuevamente el mensaje hasta que expire el período de bloqueo. Para obtener más información, inicialice la sesión. |
Init isDone |
Esta acción Inicializar variable crea una variable booleana que se establece en false e indica cuando se cumplen las condiciones siguientes: - No hay más mensajes disponibles para lectura en la sesión. Para obtener más información, consulte Inicialización de la sesión. |
Try |
Esta acción de Ámbito contiene las acciones que se ejecutan para procesar un mensaje. Si se produce un problema en el ámbito Try , la siguiente acción de ámbito Catch controla ese problema. Para obtener más información, consulte Ámbito "try". |
Catch |
Esta acción de Ámbito contiene las acciones que se ejecutan si se produce un problema en el ámbito Try anterior. Para obtener más información, consulte Ámbito "catch". |
Ámbito "Try"
Este es el flujo general de la acción de ámbito Try
cuando se contraen los detalles:
Nombre | Descripción |
---|---|
Send initial message to topic |
Puede reemplazar esta acción por cualquier otra que quiera para controlar el primer mensaje de la sesión en la cola. El id. de sesión especifica la sesión. En el caso de esta plantilla, una acción de Service Bus envía el primer mensaje a un tema de Service Bus. Para obtener más información, consulte Control del mensaje inicial. |
(rama paralela) | Esta acción de rama paralela crea dos rutas de acceso: - Rama n.º 1: continúa el procesamiento del mensaje. Para obtener más información, consulte Rama n.º 1: Completar el mensaje inicial de la cola. - Rama n.º 2: abandona el mensaje si se produce algún error y lo libera para que lo use otra ejecución de desencadenador. Para obtener más información, consulteRama n.º 2: Abandonar el mensaje inicial de la cola. Ambas rutas se unen más adelante en la acción Close session in a queue and succeed (Cerrar la sesión de una cola y finalizar correctamente), que se describe en la siguiente fila. |
Close a session in a queue and succeed |
Esta acción de Service Bus combina las ramas descritas anteriormente y cierra la sesión de la cola después de que se produzca cualquiera de los siguientes eventos: - El flujo de trabajo termina de procesar los mensajes disponibles en la cola. Para obtener más información, consulte Cerrar la sesión de una cola y finalizar correctamente. |
Rama n.º 1: Completar el mensaje inicial de la cola
Nombre | Descripción |
---|---|
Complete initial message in queue |
Esta acción de Service Bus marca un mensaje recuperado correctamente como completo y quita el mensaje de la cola para evitar que vuelva a procesarse. Para obtener más información, consulte Control del mensaje inicial. |
While there are more messages for the session in the queue |
Este bucle Until sigue obteniendo mensajes mientras exista alguno o hasta que pase una hora. Para obtener más información sobre las acciones de este bucle, consulte Mientras haya más mensajes para la sesión en la cola. |
Set isDone = true |
Cuando no hay más mensajes, esta acción Establecer variable establece isDone en true . |
Renew session lock until cancelled |
Este bucle Until se asegura de que la aplicación lógica mantiene el bloqueo de sesión mientras haya mensajes o hasta que pase una hora. Para obtener más información sobre las acciones de este bucle, consulte Renovación del bloqueo de sesión hasta que se cancele. |
Rama n.º 2: Abandonar el mensaje inicial de la cola
Si se produce un error en la acción que controla el primer mensaje, la acción de Service Bus Abandon initial message from the queue (Abandonar el mensaje inicial de la cola) libera el mensaje para que otra ejecución de instancia del flujo de trabajo la procese. Para obtener más información, consulte Control del mensaje inicial.
Ámbito "Catch"
Si se produce un error en las acciones del ámbito Try
, la aplicación lógica todavía debe cerrar la sesión. La acción de ámbito Catch
se ejecuta cuando la acción del ámbito Try
produce el estado Failed
, Skipped
o TimedOut
. El ámbito devuelve un mensaje de error que incluye el id. de sesión en el que se produjo el problema y finaliza la aplicación lógica.
Este es el flujo general de la acción de ámbito Catch
cuando se contraen los detalles:
Nombre | Descripción |
---|---|
Close a session in a queue and fail |
Esta acción de Service Bus cierra la sesión en la cola para que el bloqueo de sesión no se mantenga abierta. Para obtener más información, consulte Cerrar la sesión de una cola y finalizar con errores. |
Find failure msg from 'Try' block |
Esta acción Filtrar matriz crea una matriz a partir de las entradas y salidas de todas las acciones dentro del ámbito Try en función de los criterios especificados. En este caso, esta acción devuelve los resultados de las acciones que dieron como resultado el estado Failed . Para obtener más información, consulte Búsqueda del mensaje de error en el bloque "Try". |
Select error details |
Esta acción Seleccionar crea una matriz que contiene objetos JSON basados en los criterios especificados. Estos objetos JSON se crean a partir de los valores de la matriz que creó la acción anterior, Find failure msg from 'Try' block . En este caso, esta acción devuelve una matriz que contiene un objeto JSON que se creó a partir de los detalles de error devueltos por la acción anterior. Para obtener más información, consulte Seleccionar detalles del error. |
Terminate |
Esta acción Finalizar detiene la ejecución del flujo de trabajo, cancela cualquier acción en curso, omite las acciones restantes y devuelve el estado especificado, id. de sesión y el resultado de error de la acción Select error details . Para obtener más información, consulte Finalización de la aplicación lógica. |
Relleno de la plantilla
Para proporcionar los valores para el desencadenador y las acciones en la plantilla Entrega ordenada y correlacionada mediante sesiones de Service Bus, siga estos pasos. Debe proporcionar todos los valores necesarios, que están marcados con un asterisco ( * ), para poder guardar la aplicación lógica.
Inicialización de la sesión
En el caso del desencadenador Cuando se recibe un mensaje en una cola (bloque de inspección) , proporcione esta información para que la plantilla pueda inicializar una sesión mediante la propiedad id. de sesión, por ejemplo:
Nota
En principio, el intervalo de sondeo se establece en tres minutos para que la aplicación lógica no se ejecute con más frecuencia de la esperado y ocasione cargos de facturación imprevistos. Lo ideal es que establezca el intervalo y la frecuencia en 30 segundos para que la aplicación lógica se desencadene inmediatamente cuando llegue un mensaje.
Propiedad Obligatorio para este escenario Value Descripción Nombre de la cola Sí <queue-name> Nombre de la cola de Service Bus creada anteriormente. En este ejemplo se usa "Fabrikam-Service-Bus-Queue". Tipo de cola Sí Primario Cola de Service Bus principal. Id. de sesión Sí Próximo disponible Esta opción obtiene una sesión para cada ejecución del desencadenador, en función del id. de sesión del mensaje en la cola de Service Bus. La sesión también de bloquea para que ninguna otra aplicación lógica u otro cliente pueda procesar los mensajes relacionados con esta sesión. Las siguientes acciones del flujo de trabajo procesan todos los mensajes que están asociados a esa sesión, como se describe más adelante en este artículo. A continuación se presenta más información sobre las demás opciones de id. de sesión:
- Ninguno: La opción predeterminada, que no da como resultado ninguna sesión y no se puede usar para implementar el patrón de convoy secuencial.
- Especificar un valor personalizado: Use esta opción si conoce el id. de sesión que quiere usar y ejecutará el desencadenador de ese id. de sesión.
Nota: El conector de Service Bus puede guardar un número limitado de sesiones únicas a la vez de Azure Service Bus en la memoria caché del conector. Si el número de sesiones supera este límite, las sesiones antiguas se quitan de la caché. Para obtener más información, consulte Intercambio de mensajes en la nube con Azure Logic Apps y Azure Service Bus.
Intervalo Sí <number-of-intervals> Número de unidades de tiempo entre repeticiones antes de comprobar la existencia de mensajes. Frecuencia Sí Segundo, Minuto, Hora, Día, Semana o Mes Unidad de tiempo de la periodicidad que se va a usar al comprobar la existencia de mensajes. Sugerencia: Para agregar una Zona horaria u Hora de inicio, seleccione estas propiedades en la lista Agregar nuevo parámetro.
Para más información sobre el desencadenador, consulte Service Bus: Cuando se recibe un mensaje en una cola (bloque de inspección). El desencadenador genera un ServiceBusMessage.
Después de inicializar la sesión, el flujo de trabajo usa la acción Inicializar variable para crear una variable booleana que al principio se establece en false
e indica cuando se cumplen las condiciones siguientes:
No hay más mensajes disponibles para lectura en la sesión.
Ya no es necesario renovar el bloqueo de sesión, por lo que la instancia de flujo de trabajo actual puede finalizar.
Después, en el bloque Try, el flujo de trabajo realiza acciones en el primer mensaje que se lea.
Control del mensaje inicial
La primera acción es un marcador de posición de acción de Service Bus, Send initial message to topic (Enviar el mensaje inicial a un tema), que puede reemplazar por cualquier otra acción que quiera usar para administrar el primer mensaje de la sesión en la cola. El id. de sesión especifica la sesión de origen del mensaje.
El marcador de posición de acción de Service Bus envía el primer mensaje al tema de Service Bus que especifica la propiedad id. de sesión. De este modo, todos los mensajes que están asociados a una sesión específica se envían al mismo tema. Todas las propiedades id. de sesión de las siguientes acciones en esta plantilla usan el mismo valor de id. de sesión.
En la acción de Service Bus Complete initial message in queue (Completar el mensaje inicial de la cola) proporcione el nombre de la cola de Service Bus y deje todos los demás valores de propiedad predeterminados de la acción.
En la acción de Service Bus Abandon initial message from the queue (Abandonar el mensaje inicial de la cola) proporcione el nombre de la cola de Service Bus y deje todos los demás valores de propiedad predeterminados de la acción.
A continuación, proporcione la información necesaria para las acciones que se realizan después de Complete initial message in queue (Completar el mensaje inicial de la cola). Comience por las acciones del bucle While there are more messages for the session in the queue (Mientras haya más mensajes para la sesión en la cola).
Mientras haya más mensajes para la sesión en la cola
Este bucle Until ejecuta las acciones mientras existan mensajes en la cola o hasta que pase una hora. Para cambiar el límite de tiempo del bucle, edite el valor de la propiedad Tiempo de expiración del bucle.
Obtenga los mensajes adicionales de la cola mientras haya mensajes.
Compruebe el número de mensajes restantes. Si todavía hay mensajes, siga procesándolos. Si no hay ningún mensaje, el flujo de trabajo establece la variable
isDone
entrue
y sale del bucle.
Proporcione el nombre de la cola de Service Bus en la acción de Service Bus Get additional messages from session (Obtener mensajes adicionales de la sesión). De lo contrario, mantenga todos los demás valores predeterminados de propiedad de la acción.
Nota
De forma predeterminada, el número máximo de mensajes se establece en
175
, pero las propiedades de tamaño de mensaje y tamaño máximo de mensaje de Service Bus afectan este límite. Para más información, consulte Tamaño de mensaje para una cola.Después, el flujo de trabajo se divide en las siguientes ramas paralelas:
Si se produce un error durante la comprobación de mensajes adicionales, establezca la variable
isDone
entrue
.La condición Process messages if we got any (Procesar los mensajes, si hay alguno) comprueba si el número de mensajes restantes es cero. Si es false y quedan más mensajes, continúa con el procesamiento. Si es true y no hay ningún mensaje, el flujo de trabajo establece la variable
isDone
entrue
.
En la sección Si es falso, un bucle For each procesa cada mensaje en el orden primero en entrar, primero en salir (FIFO). En la Configuración del bucle, el valor Control de simultaneidad se establece en
1
, por lo que solo se procesa un mensaje cada vez.Proporcione el nombre de la cola de Service Bus para las acciones de Service Bus Completar el mensaje en una cola y Abandonar el mensaje en una cola.
Cuando haya finalizado el bucle While there are more messages for the session in the queue (Mientras haya más mensajes para la sesión en la cola), el flujo de trabajo establecerá la variable
isDone
entrue
.
A continuación, proporcione la información necesaria para las acciones del bucle Renew session lock until cancelled (Renovar bloqueo de sesión hasta que se cancele).
Renovar bloqueo de sesión hasta que se cancele
Este bucle Until se asegura de que la aplicación lógica mantenga el bloqueo de sesión mientras haya mensajes o hasta que pase una hora al ejecutar estas acciones. Para cambiar el límite de tiempo del bucle, edite el valor de la propiedad Tiempo de expiración del bucle.
Use un retraso de 25 segundos o una cantidad de tiempo menor que la duración del tiempo de expiración de bloqueo para la cola que se está procesando. La duración mínima del bloqueo es de 30 segundos, por lo que el valor predeterminado resulta suficiente. Sin embargo, puede optimizar el número de veces que el bucle se ejecuta si lo ajusta según corresponda.
Compruebe si la variable
isDone
está establecida entrue
.Si
isDone
está establecida entrue
, el flujo de trabajo sigue procesando mensajes, por lo que se renovará el bloqueo de la sesión en la cola y se comprobará de nuevo la condición del bucle.Debe proporcionar el nombre de la cola de Service Bus en la acción de Service Bus Renovar bloqueo de la sesión de una cola.
Si
isDone
está establecida entrue
, el flujo de trabajo no renovará el bloqueo de la sesión de la cola y saldrá del bucle.
Renovar bloqueo de la sesión de una cola
Esta acción de Service Bus renueva el bloqueo en la sesión de la cola mientras el flujo de trabajo siga procesando mensajes.
Proporcione el nombre de la cola de Service Bus en la acción de Service Bus Renovar bloqueo de la sesión de una cola.
A continuación, proporcione la información necesaria para la acción de Service Bus Close session in a queue and succeed (Cerrar la sesión de una cola y finalizar correctamente).
Cerrar la sesión de una cola y finalizar correctamente
Esta acción de Service Bus cierra la sesión en la cola después de que el flujo de trabajo termina de procesar todos los mensajes disponibles en la cola, o cuando el flujo de trabajo abandona el mensaje inicial.
Proporcione el nombre de la cola de Service Bus en la acción de Service Bus Close session in a queue and succeed (Cerrar la sesión de una cola y finalizar correctamente).
En las secciones siguientes se describen las acciones de la sección Catch
, que controlan los errores y las excepciones que se producen en el flujo de trabajo.
Cerrar la sesión de una cola y finalizar con errores
Esta acción de Service Bus siempre se ejecuta como la primera acción del ámbito Catch
y cierra la sesión de la cola.
Proporcione el nombre de la cola de Service Bus en la acción de Service Bus Close session in a queue and fail (Cerrar la sesión de una cola y finalizar con errores).
Después, el flujo de trabajo crea una matriz que tiene las entradas y salidas de todas las acciones del ámbito Try
para que la aplicación lógica pueda acceder a la información sobre el error que se produjo.
Búsqueda del mensaje de error en el bloque "Try"
Esta acción Filtrar matriz crea una matriz que contiene las entradas y salidas de todas las acciones dentro del ámbito Try
en función de los criterios especificados mediante la función result()
. En este caso, esta acción devuelve los resultados de las acciones que tienen el estado Failed
mediante la función equals()
y la función item()
.
Esta es la definición JSON para esta acción:
"Find_failure_msg_from_'Try'_block": {
"inputs": {
"from": "@Result('Try')",
"where": "@equals(item()['status'], 'Failed')"
},
"runAfter": {
"Close_the_session_in_the_queue_and_fail": [
"Succeeded"
]
},
"type": "Query"
},
Después, el flujo de trabajo crea una matriz con un objeto JSON que contiene la información de errores en la matriz que devolvió la acción Find failure msg from 'Try' block
.
Seleccionar detalles del error
Esta acción Seleccionar crea una matriz que contiene objetos JSON basados en la matriz de entradas que fue el resultado de la acción anterior, Find failure msg from 'Try' block
. En concreto, esta acción devuelve una matriz que solo tiene las propiedades especificadas para cada objeto de la matriz. En este caso, la matriz contiene las propiedades de nombre de acción y resultado del error.
Esta es la definición JSON para esta acción:
"Select_error_details": {
"inputs": {
"from": "@body('Find_failure_msg_from_''Try''_block')[0]['outputs']",
"select": {
"action": "@item()['name']",
"errorResult": "@item()"
}
},
"runAfter": {
"Find_failure_msg_from_'Try'_block": [
"Succeeded"
]
},
"type": "Select"
},
Después, el flujo de trabajo detiene la ejecución de la aplicación lógica y devuelve el estado de ejecución junto con más información sobre el error que se produjo.
Terminar la ejecución de la aplicación lógica
Esta acción Terminar detiene la ejecución de la aplicación lógica y devuelve Failed
como estado de ejecución de la aplicación lógica, junto con el id. de sesión y el resultado de errores de la acción Select error details
.
Esta es la definición JSON para esta acción:
"Terminate": {
"description": "This Failure Termination only runs if the Close Session upon Failure action runs - otherwise the LA will be terminated as Success",
"inputs": {
"runError": {
"code": "",
"message": "There was an error processing messages for Session ID @{triggerBody()?['SessionId']}. The following error(s) occurred: @{body('Select_error_details')['errorResult']}"
},
"runStatus": "Failed"
},
"runAfter": {
"Select_error_details": [
"Succeeded"
]
},
"type": "Terminate"
}
},
Guardado y ejecución de la aplicación lógica
Después de completar la plantilla, ya puede guardar la aplicación lógica. En la barra de herramientas del diseñador, seleccione Save (Guardar).
Para probar la aplicación lógica, envíe mensajes a la cola de Service Bus.
Pasos siguientes
- Más información acerca de las acciones y los desencadenadores del conector de Service Bus.