Introdução ao Armazenamento de Filas do Azure usando F#

O Armazenamento de Filas do Azure fornece mensagens na nuvem entre componentes de aplicativos. Na conceção de aplicações para escalabilidade, os componentes da aplicação são frequentemente desacoplados, de modo a que possam escalar de forma independente. O Armazenamento de filas fornece um serviço de mensagens assíncrono para uma comunicação entre os componentes da aplicação, quer estejam a ser executados na nuvem, no ambiente de trabalho, num servidor no local ou num dispositivo móvel. O Armazenamento de Filas também suporta a gestão de tarefas assíncronas e a criação de fluxos de trabalho.

Acerca deste tutorial

Este tutorial mostra como escrever código F# para algumas tarefas comuns usando o Armazenamento de Filas do Azure. As tarefas abrangidas incluem a criação e eliminação de filas e a adição, leitura e eliminação de mensagens de fila.

Para obter uma visão geral conceitual do armazenamento em fila, consulte o guia .NET para armazenamento em fila. Para facilitar, esses tutoriais usam cadeias de conexão para autenticar com o Azure. Para uma segurança ideal, você deve usar o Microsoft Entra ID com identidades gerenciadas.

Pré-requisitos

Para usar este guia, você deve primeiro criar uma conta de armazenamento do Azure. Você também precisará da sua chave de acesso de armazenamento para essa conta.

Crie um script F# e inicie o F# interativo

Os exemplos neste artigo podem ser usados em um aplicativo F# ou um script F#. Para criar um script F#, crie um arquivo com a .fsx extensão, por exemplo queues.fsx, em seu ambiente de desenvolvimento F#.

Como executar scripts

F# interativo, dotnet fsi, pode ser iniciado interativamente, ou pode ser iniciado a partir da linha de comando para executar um script. A sintaxe da linha de comando é

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

Adicionar pacotes em um script

Em seguida, use #rnuget:package name para instalar o pacote Azure.Storage.Queues e os espaços de nomes open.

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

Adicionar declarações de namespaces

Adicione as seguintes declarações open à parte superior do ficheiro queues.fsx:

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

Obter a sua string de conexão

Você precisará de uma cadeia de conexão do Armazenamento do Azure para este tutorial. Para obter mais informações sobre cadeias de conexão, consulte Configurar cadeias de conexão de armazenamento.

Para o tutorial, você inserirá sua cadeia de conexão no script, da seguinte forma:

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

Criar o cliente de serviço de fila

A QueueClient classe permite-lhe recuperar filas armazenadas no armazenamento de Fila. Aqui está uma maneira de criar o cliente:

let queueClient = QueueClient(storageConnString, "myqueue")

Agora, está preparado para escrever código que lê dados de e escreve dados para o Armazenamento de Queue.

Criar uma fila

Este exemplo mostra como criar uma fila se ela ainda não existir:

queueClient.CreateIfNotExists()

Introduzir uma mensagem numa fila

Para inserir uma mensagem em uma fila existente, primeiro crie uma nova Mensagem. Em seguida, chame o método SendMessage. Uma mensagem pode ser criada a partir de uma cadeia de caracteres (no formato UTF-8) ou de uma byte matriz, 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

Pré-visualização da mensagem seguinte

Pode visualizar a mensagem no início de uma fila, sem retirá-la da fila, chamando o método PeekMessage.

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

Obter a próxima mensagem para processamento

Você pode recuperar a mensagem na frente de uma fila para processamento chamando o método ReceiveMessage.

let updateMessage = queueClient.ReceiveMessage().Value

Mais tarde, indica o processamento bem-sucedido da mensagem usando DeleteMessage.

Alterar os conteúdos de uma mensagem em fila

Você pode alterar o conteúdo de uma mensagem recuperada diretamente na fila. Se a mensagem representa uma tarefa de trabalho, pode utilizar esta funcionalidade para atualizar o estado da tarefa de trabalho. O seguinte código atualiza a mensagem de filas com novos conteúdos e expande o tempo limite de visibilidade em 60 segundos. Isto guarda o estado do trabalho associado à mensagem e atribui ao cliente outro minuto para continuar a trabalhar na mensagem. Pode utilizar esta técnica para controlar fluxos de trabalho de vários passos em mensagens de filas, sem ser necessário recomeçar do início se falhar um passo de processamento devido a uma falha de hardware ou software. Normalmente, você também manteria uma contagem de tentativas e, se a mensagem for repetida mais do que um número de vezes, você a excluirá. Esta ação protege contra uma mensagem que aciona um erro da aplicação sempre que é processada.

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

Remover a mensagem seguinte da fila

O código remove uma mensagem da fila em dois passos. Quando chama ReceiveMessage, recebe a próxima mensagem na fila. Uma mensagem retornada de ReceiveMessage torna-se invisível para qualquer outro código que leia mensagens dessa fila. Por predefinição, esta mensagem permanece invisível durante 30 segundos. Para concluir a remoção da mensagem da fila, você também deve chamar DeleteMessage. Este processo de dois passos da remoção de uma mensagem garante que se o código não conseguir processar uma mensagem devido a uma falha de hardware ou software, outra instância do seu código poderá obter a mesma mensagem e tentar novamente. O seu código chama DeleteMessage logo após a mensagem ter sido processada. Todos os métodos da Fila que mostramos até agora têm Async alternativas.

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

Utilizar fluxos de trabalho assíncronos com as APIs comuns de armazenamento de filas

Este exemplo mostra como usar um fluxo de trabalho assíncrono com APIs comuns de armazenamento em fila.

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
}

Opções adicionais para eliminar o enfileiramento de mensagens

Existem duas formas através das quais pode personalizar a obtenção de mensagens a partir de uma fila. Em primeiro lugar, pode obter um lote de mensagens (até 32). Em segundo lugar, pode definir um tempo limite de invisibilidade superior ou inferior, dando mais ou menos tempo ao código para processar totalmente cada mensagem. O exemplo de código a seguir usa ReceiveMessages para obter 20 mensagens em uma chamada e, em seguida, processa cada mensagem. Define também o tempo limite de invisibilidade para cinco minutos para cada mensagem. Os 5 minutos começam para todas as mensagens ao mesmo tempo, portanto, após 5 minutos desde a chamada para ReceiveMessages, todas as mensagens que não foram excluídas se tornarão visíveis novamente.

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

Obter o comprimento da fila

Pode obter uma estimativa do número de mensagens numa fila. O GetProperties método solicita que o serviço de fila recupere os atributos da fila, incluindo a contagem de mensagens. A ApproximateMessagesCount propriedade retorna o último valor recuperado GetProperties pelo método.

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

Eliminar uma fila

Para excluir uma fila e todas as mensagens contidas nela, chame o Delete método no objeto de fila.

queueClient.DeleteIfExists()

Nota

Se estiver a migrar das bibliotecas antigas, as mensagens eram codificadas em Base64 por padrão, mas as novas bibliotecas não o fazem, porque têm melhor desempenho. Para obter informações sobre como configurar a codificação, consulte MessageEncoding.

Consulte também