Desencadenador de cola

Completado

Una cola de mensajes es un componente de software que se usa para controlar la mensajería entre procesos, subprocesos o aplicaciones. Una cola puede almacenar un mensaje y los trabajos pueden capturar el mensaje cuando sea un buen momento.

En la nube, las colas de mensajes pueden generar eventos con una carga. Un servicio como Azure Functions puede escuchar este tipo de mensaje y ejecutar su código cuando se publique un mensaje.

Trabajo con colas de mensajes

Para que una función de Azure pueda consumir un mensaje de una cola de mensajes, necesita un desencadenador y, posiblemente, un enlace.

Una función de Azure debe escuchar una cola específica para que su código se desencadene cuando se publique un nuevo mensaje en esa cola. Para configurar un desencadenador, debe proporcionar las credenciales adecuadas para que el código del desencadenador sepa cómo conectarse a la cola de mensajes. Cree una entrada en el archivo function.json para la función que escucha la cola. En el elemento bindings, especifique estas propiedades en una entrada:

Propiedad Value
name Nombre al que puede hacer referencia en el código
type queueTrigger
direction in
queueName Nombre asignado a la cola
connection Una variable de configuración en local.settings.json

Se puede definir una entrada de ejemplo de esta forma:

{
    "name": "myQueueItem",
    "type": "queueTrigger",
    "direction": "in",
    "queueName": "messages-incoming",
    "connection": "AzureWebJobsStorage"
  }

Si esta cola reside en una cuenta de almacenamiento, AzureWebJobsStorage es el valor de la cadena de conexión.

No se necesita estrictamente un enlace al consumir un mensaje de una cola. Sin embargo, si desea escribir en una cola, necesita un enlace de salida. Con este tipo de enlace, se obtiene una referencia a la cola deseada.

Nota:

Actualmente, solo se admiten enlaces de salida para las colas.

Desarrollo local

Como desarrollador, quiere ciclos de comentarios cortos. También quiere asegurarse de que la experiencia de desarrollo sea lo más parecida posible a un entorno de producción. Una manera de lograr ambos objetivos es mediante un emulador de cola.

Un emulador de cola permite simular mensajes de cola reales a los que responderá la función de Azure. Para usar el emulador:

  1. Instale el emulador. Busque Azurite en Visual Studio Code o descargue la extensión de Azurite.

  2. Para usar la funcionalidad del emulador, debe iniciarla seleccionando Azure: Start Queue Service (Azure: Iniciar Queue service) en la paleta de comandos.

    Al ejecutar este comando se inicia un agente de escucha denominado Explorador de Azure Storage que otra aplicación puede captar. Explorador de Storage es una aplicación cliente que le permite examinar los recursos en la nube y usar la funcionalidad del emulador.

  3. Descargue el Explorador de Azure Storage. A continuación, abra la aplicación y verá la siguiente indicación de que el emulador funciona:

    Screenshot that shows the emulator in Azure Storage Explorer.

  4. Cree una cola en el emulador. Usará esta cola como parte de la configuración del punto de conexión de la función. Al hacer clic con el botón derecho en el elemento de cola, puede crear una nueva cola.

  5. Para asegurarse de que la aplicación de Functions usa el emulador, debe establecer la cadena de conexión correctamente. Abra el archivo local.settings.json, busque el elemento AzureWebJobsStorage y asígnele el valor "UseDevelopmentStorage=true".

    Nota:

    Recuerde establecer esta propiedad de otra forma al cambiar a la nube. Debe apuntar a un recurso real en Azure cuando está en producción.

Compilación de la función

Ahora tiene un emulador local configurado, que tiene una cola. También ha configurado el proyecto para que apunte al emulador local. Ahora debe crear una función para controlar un desencadenador de cola.

Creación de un punto de conexión de función

Está listo para crear una función que pueda controlar los mensajes de cola entrantes. Cree una carpeta para la función y asígnele un nombre, como queueTrigger. A continuación, cree un archivo function.json y proporciónele el siguiente contenido:

{
  "bindings": [{
    "name" "queueItem",
    "type": "queueTrigger",
    "direction": "in",
    "queueName" : "items",
    "connection": "AzureWebJobsStorage"
  }]
}

El valor del elemento name es importante, ya que hará referencia a este más adelante en el código para analizar los datos entrantes de la cola. Debe ser de tipo queueTrigger para que la cola lo desencadene cuando haya un mensaje nuevo.

El elemento queueName identifica de forma única la cola con la que está interactuando. Lo que escriba aquí debe coincidir con el nombre de la cola en el emulador o el nombre de la cola real que se asigne posteriormente en Azure.

El elemento connection apunta al valor del elemento AzureWebJobsStorage en el archivo local.settings.json.

Control de un mensaje de cola

Para controlar un mensaje de cola entrante, debe escribir código que pueda analizar el mensaje que necesita. En este momento, puede decidir qué hacer a continuación. Por ejemplo, puede iniciar una solicitud web, colocar el mensaje en otra cola o enviarlo a una base de datos.

Configuración de una ruta

Necesita una ruta para controlar las solicitudes entrantes. Azure Functions controlará las solicitudes a una cola en la raíz. Al configurar una ruta como se muestra a continuación, la solicitud se invocará como http://localhost:<port>/queueTrigger:

http.HandleFunc("/queueTrigger", handleQueueTrigger)

Descodificación de una solicitud

Cuando se le envía el mensaje de cola, tiene esta forma:

{
  "Data": {
    "queueItem": "your message"
  },
  "Metadata": {
    "DequeueCount": 1,
    "ExpirationTime": "2019-10-16T17:58:31+00:00",
    "Id": "800ae4b3-bdd2-4c08-badd-f08e5a34b865",
    "InsertionTime": "2019-10-09T17:58:31+00:00",
    "NextVisibleTime": "2019-10-09T18:08:32+00:00",
    "PopReceipt": "AgAAAAMAAAAAAAAAAgtnj8x+1QE=",
    "sys": {
      "MethodName": "QueueTrigger",
      "UtcNow": "2019-10-09T17:58:32.2205399Z",
      "RandGuid": "24ad4c06-24ad-4e5b-8294-3da9714877e9"
    }
  }
}

Como parte de la descodificación de esa solicitud entrante, necesita una estructura auxiliar que modele el mensaje anterior. Debería tener este aspecto:

type InvokeRequest {
   Data map[string]json.RawMessage
   Metadata map[string]interface{}
}

Comience a escribir código para recibir esa solicitud entrante y descodificarla:

func handleQueueTrigger(w http.ResponseWrite, r *http.Request) {
   var invokeRequest InvokeRequest
   d := json.NewDecoder(r.Body)
   d.Decode(&invokeRequest)
}

Ahora está en un punto en el que la solicitud se ha descodificado, pero debe analizar el propio mensaje de cola.

Análisis de un mensaje de cola

Una vez descodificada la solicitud, el mensaje de cola se puede recuperar de la solicitud en la propiedad Data. También debe hacer referencia al mensaje por el valor de propiedad name que configuró en el archivo function.json. El código para recuperar el mensaje es una frase breve como la siguiente:

invokeRequest.Data["queueItem"]

Dado que debe poder leer este mensaje en texto no cifrado, usará una biblioteca JSON y la analizará. La biblioteca JSON usará un método Unmarshal() que adopta dos parámetros: el mensaje que se va a analizar y la variable en la que se va a colocar el mensaje analizado. Por tanto, el código debe tener un aspecto similar al siguiente:

var parsedMessage string
json.Unmarshal(invokeRequest.Data["queueItem"], &parsedMessage)

En este momento, parsedMessage contiene el mensaje. Si desea imprimirlo en la consola, use el código siguiente:

fmt.Println(parsedMessage) // your message

Nota:

Si el mensaje es algo más avanzado que una cadena, parsedMessage debe tener una estructura que coincida con la forma de lo que queueMessage apunta.

Desencadenar un mensaje

Para probar la aplicación, puede usar el Explorador de Azure Storage. En el panel derecho de la herramienta, seleccione el botón Agregar mensaje para crear un mensaje en la cola.

Screenshot that shows the button for adding a message on the queue.

Si tiene la aplicación de Functions y se está ejecutando en este momento, desencadenará el enlace y se invocará el código.