Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La funzionalità Azure Queue Storage fornisce la messaggistica cloud tra i componenti dell'applicazione. Durante la progettazione di applicazioni scalabili, i componenti dell'applicazione vengono spesso separati, per poter essere scalati in modo indipendente. L'archiviazione di code fornisce la messaggistica asincrona per la comunicazione tra i componenti dell'applicazione, che possono essere eseguiti nel cloud, su un desktop, su un server on-premise o su un dispositivo mobile. L'archiviazione tramite code supporta anche la gestione di attività asincrone e la creazione di processi di lavoro.
Informazioni sulla guida
Questa esercitazione illustra come scrivere codice F# per alcune attività comuni che usano Azure Queue Storage. Le attività presentate includono creazione ed eliminazione di code, nonché aggiunta, lettura ed eliminazione di messaggi di coda.
Per una panoramica concettuale dell'archiviazione delle code, fare riferimento alla guida .NET per l'archiviazione delle code. Per semplicità, queste esercitazioni usano stringhe di connessione per l'autenticazione con Azure. Per una sicurezza ottimale, è consigliabile usare Microsoft Entra ID con identità gestite.
Prerequisiti
Per usare questa guida, è necessario creare prima un account di archiviazione di Azure. Sarà inoltre necessaria la chiave di accesso alle risorse di archiviazione per accedere a questo account.
Creare uno script F# e avviare F# interattivo
Gli esempi in questo articolo possono essere usati in un'applicazione F# o in uno script F#. Per creare uno script F#, creare un file con l'estensione .fsx, ad esempio queues.fsx nell'ambiente di sviluppo F#.
Come eseguire gli script
F# Interactive, dotnet fsi, può essere avviato in modo interattivo oppure può essere avviato dalla riga di comando per eseguire uno script. La sintassi della riga di comando è
> dotnet fsi [options] [ script-file [arguments] ]
Aggiungere pacchetti in uno script
Successivamente, usa #rnuget:package name per installare il pacchetto Azure.Storage.Queues e le namespace open.
> #r "nuget: Azure.Storage.Queues"
open Azure.Storage.Queues
Aggiungere le dichiarazioni dello spazio dei nomi
Aggiungere le istruzioni open seguenti all'inizio del file queues.fsx:
open Azure.Storage.Queues // Namespace for Queue storage types
open System
open System.Text
Ottieni la tua stringa di connessione
Per questo tutorial, sarà necessaria una stringa di connessione di Archiviazione di Azure. Per maggiori informazioni sulle stringhe di connessione, consultare la sezione Configurazione delle stringhe di connessione di Archiviazione.
Per il tutorial, immettere la stringa di connessione nello script, come illustrato di seguito:
let storageConnString = "..." // fill this in from your storage account
Creare il client del servizio di accodamento
La classe QueueClient consente di recuperare le code archiviate nell'Archiviazione di code. Ecco come creare il client:
let queueClient = QueueClient(storageConnString, "myqueue")
A questo punto si è pronti a scrivere codice che legge e scrive i dati nell'archivio code.
Crea una coda
Questo esempio illustra come creare una coda se non esiste già:
queueClient.CreateIfNotExists()
Inserire un messaggio in una coda
Per inserire un messaggio in una coda esistente, creare prima un nuovo messaggio. Quindi chiamare il metodo SendMessage. È possibile creare un messaggio da una stringa (in formato UTF-8) o da una matrice byte come questa:
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
Visualizzare il messaggio successivo
È possibile visualizzare il messaggio successivo di una coda senza rimuoverlo dalla coda chiamando il metodo PeekMessage.
let peekedMessage = queueClient.PeekMessage()
let messageContents = peekedMessage.Value.Body.ToString()
Ottenere il messaggio successivo per l'elaborazione
È possibile recuperare il messaggio all'inizio di una coda per l'elaborazione chiamando il metodo ReceiveMessage.
let updateMessage = queueClient.ReceiveMessage().Value
Successivamente, indicare l'elaborazione corretta del messaggio usando DeleteMessage.
Cambiare il contenuto di un messaggio in coda
È possibile modificare direttamente il contenuto di un messaggio recuperato nella coda. Se il messaggio rappresenta un'attività di lavoro, è possibile usare questa funzionalità per aggiornare lo stato dell'attività di lavoro. Il codice seguente aggiorna il messaggio della coda con nuovo contenuto e imposta il timeout di visibilità per estendere altri 60 secondi. In questo modo, lo stato del lavoro associato al messaggio viene salvato e il client può continuare a lavorare al messaggio per un altro minuto. È possibile usare questa tecnica per tenere traccia dei flussi di lavoro in più passaggi nei messaggi della coda, senza dover ricominciare dall'inizio se un passaggio di elaborazione ha esito negativo a causa di un errore hardware o software. In genere, è consigliabile mantenere anche un conteggio dei tentativi di ripetizione, e se il messaggio viene ripetuto più di un certo numero di volte, dovresti eliminarlo. In questo modo si protegge da un messaggio che attiva un errore dell'applicazione ogni volta che viene elaborato.
queueClient.UpdateMessage(
updateMessage.MessageId,
updateMessage.PopReceipt,
"Updated contents.",
TimeSpan.FromSeconds(60.0))
Rimuovere il messaggio successivo dalla coda
Il codice consente di rimuovere un messaggio da una coda in due passaggi. Quando si chiama ReceiveMessage, si ottiene il messaggio successivo in una coda di messaggi. Un messaggio restituito da ReceiveMessage diventa invisibile a qualsiasi altro elemento di codice che legge i messaggi di questa coda. Per impostazione predefinita, questo messaggio rimane invisibile per 30 secondi. Per completare la rimozione di un messaggio dalla coda, devi anche richiamare DeleteMessage. Questo processo in due passaggi per la rimozione di un messaggio garantisce che se il codice non riesce a elaborare un messaggio a causa di un errore hardware o software, un'altra istanza del codice può ottenere lo stesso messaggio e riprovare. Il codice chiama DeleteMessage subito dopo l'elaborazione del messaggio.
Tutti i metodi di accodamento illustrati finora hanno alternative Async.
let deleteMessage = queueClient.ReceiveMessage().Value
queueClient.DeleteMessage(deleteMessage.MessageId, deleteMessage.PopReceipt)
Utilizzare i flussi di lavoro asincroni con le API comuni per l'archiviazione delle code
In questo esempio, viene illustrato come utilizzare il flusso di lavoro async con API comuni di archiviazione delle code.
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
}
Opzioni aggiuntive per rimuovere i messaggi dalla coda
È possibile personalizzare il recupero di messaggi da una coda in due modi.
Innanzitutto, è possibile recuperare un batch di messaggi (massimo 32). In secondo luogo, è possibile impostare un timeout di invisibilità più lungo o più breve assegnando al codice più o meno tempo per l'elaborazione completa di ogni messaggio. Nell'esempio di codice seguente, viene utilizzato il metodo ReceiveMessages per recuperare 20 messaggi con una sola chiamata ed elaborare ciascun messaggio. Per ogni messaggio, inoltre, il timeout di invisibilità viene impostato su cinque minuti. I cinque minuti iniziano contemporaneamente per tutti i messaggi, quindi, una volta trascorsi i cinque minuti dalla chiamata a ReceiveMessages, tutti i messaggi che non sono stati eliminati diventano nuovamente visibili.
for dequeueMessage in queueClient.ReceiveMessages(20, Nullable(TimeSpan.FromMinutes(5.))).Value do
// Process the message here.
queueClient.DeleteMessage(dequeueMessage.MessageId, dequeueMessage.PopReceipt)
Ottenere la lunghezza della coda
È possibile ottenere una stima del numero di messaggi in una coda. Il metodo GetProperties chiede al servizio di accodamento di recuperare gli attributi della coda, incluso il numero di messaggi. La proprietà ApproximateMessagesCount restituisce l'ultimo valore recuperato dal metodo GetProperties.
let properties = queueClient.GetProperties().Value
let count = properties.ApproximateMessagesCount
Eliminare una coda
Per eliminare una coda e tutti i messaggi che contiene, chiamare il metodo Delete sull'oggetto coda.
queueClient.DeleteIfExists()
Nota
Quando si esegue la migrazione dalle librerie precedenti, i messaggi sono codificati in Base64 per impostazione predefinita, ma le nuove librerie non lo fanno perché è più efficiente. Per informazioni su come impostare la codifica, consultare la sezione MessageEncoding.