Introducción a Azure Queue Storage mediante F#

Azure Queue Storage proporciona mensajería en la nube entre componentes de aplicaciones. A la hora de diseñar aplicaciones para escala, los componentes de las mismas suelen desacoplarse para poder escalarlos de forma independiente. El almacenamiento en cola ofrece mensajería asincrónica para la comunicación entre los componentes de las aplicaciones, independientemente de si se ejecutan en la nube, en el escritorio, en un servidor local o en un dispositivo móvil. Además, este tipo de almacenamiento admite la administración de tareas asincrónicas y la creación de flujos de trabajo de procesos.

Acerca de este tutorial

En este tutorial se muestra cómo escribir código de F# para algunas tareas comunes con Azure Queue Storage. Entre las tareas descritas se incluyen la creación y la eliminación de colas y la adición, la lectura y la eliminación de mensajes de la cola.

Para información general conceptual sobre Queue Storage, consulte la guía de .NET para Queue Storage.

Requisitos previos

Para usar esta guía, primero debe crear una cuenta de almacenamiento de Azure. También necesitará la clave de acceso de almacenamiento para esta cuenta.

Creación de un script de F# e inicio interactivo de F#

Los ejemplos de este artículo se pueden usar en una aplicación de F# o en un script de F#. Para crear un script de F#, cree un archivo con la extensión .fsx, por ejemplo queues.fsx, en el entorno de desarrollo de F#.

Ejecución de los scripts

F# interactivo, dotnet fsi, se puede iniciar de forma interactiva o desde la línea de comandos para ejecutar un script. La sintaxis de línea de comandos es

> dotnet fsi [options] [ script-file [arguments] ]

Incorporación de paquetes en un script

A continuación, use #rnuget:package name para instalar el paquete Azure.Storage.Queues y los espacios de nombres open. Por ejemplo:

> #r "nuget: Azure.Storage.Queues"
open Azure.Storage.Queues

Incorporación de declaraciones de espacio de nombres

Agregue las siguientes instrucciones open en la parte superior del archivo queues.fsx:

open Azure.Storage.Queues // Namespace for Queue storage types
open System
open System.Text

Obtención de la cadena de conexión

Para este tutorial necesitará una cadena de conexión de Azure Storage. Para más información sobre las cadenas de conexión, consulte Configuración de cadenas de conexión de almacenamiento.

En el tutorial, escribirá la cadena de conexión en el script, de la siguiente manera:

let storageConnString = "..." // fill this in from your storage account

Creación del cliente del servicio de cola

La clase QueueClient permite recuperar las colas almacenadas en Queue Storage. Esta es una forma de crear el cliente:

let queueClient = QueueClient(storageConnString, "myqueue")

Ahora ya puede escribir código que lee y escribe datos en el Almacenamiento en cola.

Creación de una cola

En este ejemplo se muestra cómo crear una cola si todavía no existe:

queueClient.CreateIfNotExists()

un mensaje en una cola

Para insertar un mensaje en una cola existente, cree en primer lugar un nuevo mensaje. A continuación, llame al método SendMessage. Se puede crear un mensaje a partir de una cadena (en formato UTF-8) o de una matriz byte, como esta:

queueClient.SendMessage("Hello, World") // Insert a String message into a queue
queueClient.SendMessage(BinaryData.FromBytes(Encoding.UTF8.GetBytes("Hello, World"))) // Insert a BinaryData message into a queue

Inspección del siguiente mensaje

Puede inspeccionar el mensaje situado en la parte delantera de una cola, sin quitarlo de la cola, mediante una llamada al método PeekMessage.

let peekedMessage = queueClient.PeekMessage()
let messageContents = peekedMessage.Value.Body.ToString()

Obtención del siguiente mensaje para su procesamiento

Puede recuperar el mensaje de la parte delantera de una cola para procesarlo mediante la llamada al método ReceiveMessage.

let updateMessage = queueClient.ReceiveMessage().Value

Más adelante, puede indicar que el procesamiento del mensaje se ha realizado correctamente mediante DeleteMessage.

contenido de un mensaje en cola

Puede cambiar el contenido de un mensaje recuperado en la cola. Si el mensaje representa una tarea de trabajo, puede usar esta característica para actualizar el estado de la tarea de trabajo. El siguiente código actualiza el mensaje de la cola con contenido nuevo y amplía el tiempo de espera de la visibilidad en 60 segundos más. De este modo, se guarda el estado de trabajo asociado al mensaje y se le proporciona al cliente un minuto más para que siga elaborando el mensaje. Esta técnica se puede utilizar para realizar un seguimiento de los flujos de trabajo de varios pasos en los mensajes en cola, sin que sea necesario volver a empezar desde el principio si se produce un error en un paso del proceso a causa de un error de hardware o software. Normalmente, también mantendría un número de reintentos y, si el mensaje se intentara más que un número de veces, lo eliminaría. Esto proporciona protección frente a un mensaje que produce un error en la aplicación cada vez que se procesa.

queueClient.UpdateMessage(
    updateMessage.MessageId,
    updateMessage.PopReceipt,
    "Updated contents.",
    TimeSpan.FromSeconds(60.0))

Extracción del siguiente mensaje

El código quita un mensaje de una cola en dos pasos. Al llamar a ReceiveMessage, obtiene el siguiente mensaje de una cola. Un mensaje devuelto por ReceiveMessage se hace invisible a cualquier otro código de lectura de mensajes de esta cola. De forma predeterminada, este mensaje permanece invisible durante 30 segundos. Para terminar quitando el mensaje de la cola, también debe llamar a DeleteMessage. Este proceso de extracción de un mensaje que consta de dos pasos garantiza que si su código no puede procesar un mensaje a causa de un error de hardware o software, otra instancia de su código puede obtener el mismo mensaje e intentarlo de nuevo. El código siguiente llama a DeleteMessage justo después de haberse procesado el mensaje. Todos los métodos de cola que hemos mostrado hasta ahora tienen alternativas Async.

let deleteMessage = queueClient.ReceiveMessage().Value
queueClient.DeleteMessage(deleteMessage.MessageId, deleteMessage.PopReceipt)

Uso de flujos de trabajo asincrónicos con API de Queue Storage comunes

En este ejemplo se muestra cómo usar un flujo de trabajo asincrónico con API de Queue Storage comunes.

async {
    let! exists = queueClient.CreateIfNotExistsAsync() |> Async.AwaitTask

    let! delAsyncMessage = queueClient.ReceiveMessageAsync() |> Async.AwaitTask

    // ... process the message here ...

    // Now indicate successful processing:
    queueClient.DeleteMessageAsync(delAsyncMessage.Value.MessageId, delAsyncMessage.Value.PopReceipt) |> Async.AwaitTask
}

Opciones adicionales para quitar mensajes de la cola

Hay dos formas de personalizar la recuperación de mensajes de una cola. En primer lugar, puede obtener un lote de mensajes (hasta 32). En segundo lugar, puede establecer un tiempo de espera de la invisibilidad más largo o más corto para que el código disponga de más o menos tiempo para procesar cada mensaje. En el ejemplo de código siguiente se usan ReceiveMessages para obtener 20 mensajes en una llamada y, luego, procesar cada mensaje. También establece el tiempo de espera de la invisibilidad en cinco minutos para cada mensaje. Los 5 minutos empiezan a contar para todos los mensajes al mismo tiempo, por lo que después de pasar los 5 minutos desde la llamada a ReceiveMessages, todos los mensajes que no se han eliminado volverán a estar visibles.

for dequeueMessage in queueClient.ReceiveMessages(20, Nullable(TimeSpan.FromMinutes(5.))).Value do
        // Process the message here.
        queueClient.DeleteMessage(dequeueMessage.MessageId, dequeueMessage.PopReceipt)

la longitud de la cola

Puede obtener una estimación del número de mensajes existentes en una cola. El método GetProperties solicita a Queue service la recuperación de los atributos de la cola, incluido el número de mensajes. La propiedad ApproximateMessagesCount devuelve el último valor recuperado por el método GetProperties.

let properties = queueClient.GetProperties().Value
let count = properties.ApproximateMessagesCount

Eliminación de una cola

Para eliminar una cola y todos los mensajes contenidos en ella, llame al método Delete en el objeto de cola.

queueClient.DeleteIfExists()

Nota

Si va a migrar desde las bibliotecas antiguas, estas codifican los mensajes en Base64 de forma predeterminada, pero las nuevas bibliotecas no lo hacen porque es más eficiente. Para más información sobre cómo configurar la codificación, consulte MessageEncoding.

Consulte también