Share via


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".

Patrón de convoy secuencial general

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

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.

  1. Inicie sesión en Azure Portal. Busque y seleccione el espacio de nombres de Service Bus.

  2. 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.

    Administración de permisos para el espacio de nombres de Service Bus

  3. 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.

    1. En el panel Directivas de acceso compartido, en Directiva, seleccione RootManageSharedAccessKey.

    2. 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.

      Copia de la cadena de conexión del espacio de nombres de Service Bus

    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.

  1. 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.

  2. 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.

    Selección de la plantilla

  3. Cuando aparezca el cuadro de confirmación, seleccione Usar esta plantilla.

  4. 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.

    Seleccione

  5. 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:

      1. Seleccione Especificar la información de conexión manualmente.

      2. 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:

        Especificación del nombre de conexión y la cadena de conexión de Service Bus

        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:

      1. 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:

        Especificación del nombre de conexión y selección del espacio de nombres de Service Bus

      2. Cuando aparezca el siguiente panel, seleccione la directiva de Service Bus y, luego, Crear.

        Selección de la directiva de Service Bus y, a continuación,

  6. 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:

Flujo de trabajo general de la plantilla

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.
- Ya no es necesario renovar el bloqueo de sesión, por lo que la instancia de flujo de trabajo actual puede finalizar.

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 ámbitoCatch 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 ámbitoTry cuando se contraen los detalles:

Flujo de trabajo de la acción de ámbito

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.
- El flujo de trabajo abandona el mensaje inicial porque se produjo un error.

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 ámbitoCatch 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:

Flujo de trabajo de la acción de ámbito

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:

    Detalles del desencadenador de Service Bus

    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 <queue-name> Nombre de la cola de Service Bus creada anteriormente. En este ejemplo se usa "Fabrikam-Service-Bus-Queue".
    Tipo de cola Primario Cola de Service Bus principal.
    Id. de sesión 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 <number-of-intervals> Número de unidades de tiempo entre repeticiones antes de comprobar la existencia de mensajes.
    Frecuencia 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.

Detalles de la acción

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.

Detalles de la acción de Service Bus

  1. 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.

    Detalles de la acción de Service Bus

  2. 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.

    Detalles de la acción de Service Bus

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 en true y sale del bucle.

Bucle Until: procesamiento de mensajes mientras están en la cola

  1. 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.

    Acción de Service Bus:

    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 en true.

    • 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 en true.

    Condición: Procesar los mensajes, si los hay

    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.

    Bucle

  2. 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.

    Acciones de Service Bus:

    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 en true.

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 en true.

    • Si isDone está establecida en true, 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 en true, el flujo de trabajo no renovará el bloqueo de la sesión de la cola y saldrá del bucle.

    Bucle Until:

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.

    Acción de Service Bus:

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).

    Acción de Service Bus:

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).

    Acción de Service Bus:

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().

Acción de filtrado de matriz: Find failure msg from

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.

Acción Seleccionar:

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.

Acción Terminar para detener la ejecución de la aplicación lógica

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