Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O serviço de Fila de Armazenamento do Azure fornece mensagens na nuvem entre componentes de aplicativos. Na criação de aplicativos para escala, os componentes do aplicativo geralmente são desassociados, para que possam ser redimensionados independentemente. O armazenamento de filas fornece mensagens assíncronas para a comunicação entre os componentes do aplicativo, estando eles em execução na nuvem, na área de trabalho, em um servidor local ou em um dispositivo móvel. O armazenamento de Fila também dá suporte ao gerenciamento de tarefas assíncronas e à criação de fluxos de trabalho de processos.
Sobre este tutorial
Este tutorial mostra como escrever um código F# para alguns cenários comuns usando o Armazenamento de Filas do Azure. As tarefas abordadas incluem a criação e a exclusão de filas e a adição, a leitura e a exclusão de mensagens da fila.
Para ter uma visão geral conceitual do armazenamento de filas, confira o guia do .NET para o armazenamento de filas. Para facilitar, esses tutoriais usam cadeias de conexão para autenticar com o Azure. Para obter a segurança ideal, você deve usar o Microsoft Entra ID com identidades gerenciadas.
Pré-requisitos
Para usar este guia, primeiro, você precisará criar uma conta de armazenamento do Azure. Você também precisará ter a chave de acesso de armazenamento para essa conta.
Criar um script F# e iniciar o F# Interativo
Os exemplos deste artigo podem ser usados em um aplicativo F# ou em um script F#. Para criar um script F#, crie um arquivo com a extensão .fsx, por exemplo, queues.fsx, no ambiente de desenvolvimento F#.
Como executar scripts
O F# Interativo, dotnet fsi, pode ser iniciado de maneira interativa ou na 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 namespaces open, como
> #r "nuget: Azure.Storage.Queues"
open Azure.Storage.Queues
Adicionar declarações do namespace
Adicione as seguintes instruções open à parte superior do arquivo queues.fsx:
open Azure.Storage.Queues // Namespace for Queue storage types
open System
open System.Text
Obter a cadeia de conexão
Você precisará de uma cadeia de conexão do Azure Storage para este tutorial. Para saber mais sobre cadeias de conexão, confira Configurar cadeias de conexão de armazenamento.
Para o tutorial, você vai inserir a cadeia de conexão no script, da seguinte maneira:
let storageConnString = "..." // fill this in from your storage account
Criar o cliente do serviço Fila
A classe QueueClient permite que você recupere filas armazenadas no Armazenamento de Filas. Esta é uma forma de criar o cliente:
let queueClient = QueueClient(storageConnString, "myqueue")
Agora você está pronto para escrever um código para ler e gravar dados no Armazenamento de Filas.
Criar uma fila
Este exemplo mostra como criar uma fila se ela ainda não existe:
queueClient.CreateIfNotExists()
Inserir uma mensagem em uma fila
Para inserir uma mensagem em uma fila existente, primeiro, crie uma mensagem. Em seguida, chame o método SendMessage. Uma mensagem pode ser criada com base em uma cadeia de caracteres (no formato UTF-8) ou uma matriz byte, desta forma:
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
Olhar a próxima mensagem
Você pode inspecionar a mensagem na frente de uma fila sem removê-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
Posteriormente, você indica o processamento bem-sucedido da mensagem usando DeleteMessage.
Alterar o conteúdo de uma mensagem na fila
Você pode alterar o conteúdo de uma mensagem diretamente na fila. Se a mensagem representar uma tarefa de trabalho, você poderá usar esse recurso para atualizar o status da tarefa de trabalho. O código a seguir atualiza a mensagem da fila com novo conteúdo e define o tempo limite de visibilidade para estender mais 60 segundos. Isso salva o estado do trabalho associado à mensagem e dá ao cliente mais um minuto para continuar trabalhando na mensagem. Você pode usar essa técnica para acompanhar fluxos de trabalho de várias etapas em mensagens em fila, sem a necessidade de começar desde o início, caso uma etapa de processamento falhar devido a uma falha de hardware ou de software. Normalmente, você mantém uma contagem de repetições e, se a mensagem é repetida algumas vezes, você a exclui. Isso protege contra uma mensagem que gera um erro do aplicativo sempre que é processada.
queueClient.UpdateMessage(
updateMessage.MessageId,
updateMessage.PopReceipt,
"Updated contents.",
TimeSpan.FromSeconds(60.0))
Remover a próxima mensagem da fila
Seu código desenfileira uma mensagem de uma fila em duas etapas. Ao chamar ReceiveMessage, você recebe a próxima mensagem em uma fila. Uma mensagem retornada de ReceiveMessage torna-se invisível para qualquer outro código que leia mensagens desta fila. Por padrão, essa mensagem permanece invisível por 30 segundos. Para terminar de remover a mensagem da fila, você também deve chamar DeleteMessage. Este processo de duas etapas de remover uma mensagem garante que quando o código não processa uma mensagem devido à falhas de hardware ou de software, outra instância do seu código pode receber a mesma mensagem e tentar novamente. O código chama DeleteMessage logo depois que a mensagem tiver sido processada.
Todos os métodos Queue que mostramos até agora têm alternativas Async.
let deleteMessage = queueClient.ReceiveMessage().Value
queueClient.DeleteMessage(deleteMessage.MessageId, deleteMessage.PopReceipt)
Usar fluxos de trabalho assíncronos com APIs de Armazenamento de filas comuns
Este exemplo mostra como usar um fluxo de trabalho assíncrono com APIs de Armazenamento de filas comuns.
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 remover mensagens da fila
Há duas maneiras de personalizar a recuperação de mensagens de uma fila.
Primeiro, você pode obter um lote de mensagens (até 32). Segundo, você pode definir um tempo limite de invisibilidade mais longo ou mais curto, permitindo mais ou menos tempo para seu código processar totalmente cada mensagem. O exemplo de código a seguir usa ReceiveMessages para obter 20 mensagens em uma chamada e processa cada uma das mensagens. Ele também define o tempo limite de invisibilidade de cinco minutos para cada mensagem. Observe que os cinco minutos começam para todas as mensagens ao mesmo tempo. Portanto, após os cinco minutos desde a chamada a ReceiveMessages, todas as mensagens que não tiverem sido excluídas ficarã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 tamanho da fila
Você pode obter uma estimativa do número de mensagens em uma fila. O método GetProperties solicita que o serviço Fila recupere os atributos da fila, incluindo a contagem de mensagens. A propriedade ApproximateMessagesCount retorna o último valor recuperado pelo método GetProperties.
let properties = queueClient.GetProperties().Value
let count = properties.ApproximateMessagesCount
Excluir uma fila
Para excluir uma fila e todas as mensagens que ela contém, chame o Delete método no objeto da fila.
queueClient.DeleteIfExists()
Observação
Se você estiver migrando das bibliotecas antigas, elas codificam mensagens em Base64 por padrão, mas as novas bibliotecas não o fazem por padrão, pois isso melhora o desempenho. Para obter informações sobre como configurar a codificação, confira MessageEncoding.