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 #r
nuget: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
- API de Azure Storage para .NET
- Configuración de las cadenas de conexión de Azure Storage
- Azure Storage Services REST API Reference (Referencia de la API REST de los servicios de Azure Storage)
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de