Rozpoczynanie pracy z usługą Azure Queue Storage przy użyciu języka F#

Usługa Azure Queue Storage zapewnia obsługę komunikatów w chmurze między składnikami aplikacji. W przypadku projektowania aplikacji pod kątem skalowania składniki aplikacji są często rozłączane, dzięki czemu mogą być skalowane niezależnie. Usługa Queue Storage zapewnia asynchroniczne przesyłanie komunikatów na potrzeby komunikacji między składnikami aplikacji niezależnie od tego, czy działają w chmurze, na komputerze, serwerze lokalnym czy urządzeniu przenośnym. Magazyn kolejek obsługuje również zarządzanie zadaniami asynchronicznymi oraz tworzenie przepływów pracy procesów.

Informacje o tym samouczku

W tym samouczku pokazano, jak napisać kod języka F# dla niektórych typowych zadań przy użyciu usługi Azure Queue Storage. Omówione zadania obejmują tworzenie i usuwanie kolejek oraz dodawanie, odczytywanie i usuwanie komunikatów w kolejce.

Aby zapoznać się z koncepcyjnym omówieniem magazynu kolejek, zobacz przewodnik platformy .NET dotyczący magazynu kolejek. W celu ułatwienia te samouczki używają ciągów połączeń do uwierzytelniania na platformie Azure. Aby uzyskać optymalne zabezpieczenia, należy użyć identyfikatora Entra firmy Microsoft z tożsamościami zarządzanymi.

Wymagania wstępne

Aby użyć tego przewodnika, musisz najpierw utworzyć konto usługi Azure Storage. Będziesz również potrzebować klucza dostępu do magazynu dla tego konta.

Tworzenie skryptu języka F# i uruchamianie interaktywnego języka F#

Przykłady w tym artykule mogą być używane w aplikacji języka F# lub skryptu języka F#. Aby utworzyć skrypt języka F#, utwórz plik z .fsx rozszerzeniem, na przykład queues.fsx, w środowisku deweloperów języka F#.

Jak wykonywać skrypty

Program F# Interactive, dotnet fsi, można uruchomić interaktywnie lub można go uruchomić z poziomu wiersza polecenia, aby uruchomić skrypt. Składnia wiersza polecenia to

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

Dodaj pakiety w skrypcie

Następnie użyj polecenia #rnuget:package name, aby zainstalować pakiet Azure.Storage.Queues oraz przestrzenie nazw open.

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

Dodaj deklaracje przestrzeni nazw

Dodaj następujące instrukcje open na początku pliku queues.fsx:

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

Uzyskiwanie parametrów połączenia

Na potrzeby tego samouczka będziesz potrzebować parametry połączenia usługi Azure Storage. Aby uzyskać więcej informacji na temat ciągów połączenia, zobacz Konfigurowanie Ciągów Połączenia Magazynu.

W tym samouczku wprowadzisz parametry połączenia w skrycie, w następujący sposób:

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

Tworzenie klienta usługi kolejki

Klasa QueueClient umożliwia pobieranie kolejek przechowywanych w usłudze Queue Storage. Oto jeden ze sposobów tworzenia klienta:

let queueClient = QueueClient(storageConnString, "myqueue")

Teraz możesz przystąpić do pisania kodu, który będzie odczytywać dane z usługi Queue Storage i zapisywać je w nim.

Utwórz kolejkę

W tym przykładzie pokazano, jak utworzyć kolejkę, jeśli jeszcze nie istnieje:

queueClient.CreateIfNotExists()

Wstawianie komunikatu do kolejki

Aby wstawić komunikat do istniejącej kolejki, najpierw utwórz nowy komunikat. Następnie wywołaj metodę SendMessage . Wiadomość można utworzyć z ciągu znaków (w kodowaniu UTF-8) lub z tablicy byte w następujący sposób:

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

Podejrzyj kolejny komunikat

Możesz zajrzeć do komunikatu z przodu kolejki, bez usuwania go z kolejki, wywołując metodę PeekMessage .

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

Pobierz następny komunikat na potrzeby przetwarzania

Komunikat można pobrać na początku kolejki do przetworzenia, wywołując metodę ReceiveMessage.

let updateMessage = queueClient.ReceiveMessage().Value

Później wskazujesz pomyślne przetwarzanie komunikatu przy użyciu polecenia DeleteMessage.

Zmiana zawartości komunikatu w kolejce

Zawartość pobranego komunikatu można zmienić w kolejce. Jeśli komunikat reprezentuje zadanie robocze, możesz użyć tej funkcji, aby zaktualizować stan zadania. Poniższy kod aktualizuje komunikat kolejki o nową zawartość i ustawia rozszerzenie limitu czasu widoczności o kolejne 60 sekund. Operacja ta zapisuje stan pracy powiązanej z komunikatem i daje klientowi kolejną minutę na kontynuowanie pracy nad komunikatem. Możesz użyć tej metody do śledzenia wieloetapowych przepływów pracy związanych z komunikatami kolejek, bez konieczności rozpoczynania od nowa, gdy dany etap nie powiedzie się ze względu na awarię sprzętu lub oprogramowania. Zazwyczaj należy zachować liczbę ponownych prób, a jeśli komunikat zostanie ponowiony więcej niż kilka razy, należy go usunąć. Jest to zabezpieczenie przed komunikatami, które wyzwalają błąd aplikacji zawsze, gdy są przetwarzane.

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

Usunięcie następnego komunikatu z kolejki

Twój kod usuwa komunikat z kolejki w dwóch etapach. Po wywołaniu ReceiveMessage zostanie wyświetlony następny komunikat w kolejce. Komunikat zwrócony z ReceiveMessage staje się niewidoczny dla żadnego innego kodu odczytującego komunikaty z tej kolejki. Domyślnie komunikat pozostanie niewidoczny przez 30 sekund. Aby zakończyć usuwanie komunikatu z kolejki, należy również wywołać metodę DeleteMessage. Ten dwuetapowy proces usuwania komunikatów gwarantuje, że jeśli kod nie będzie w stanie przetworzyć komunikatu z powodu awarii sprzętu lub oprogramowania, inne wystąpienie kodu będzie w stanie uzyskać ten sam komunikat i ponowić próbę. Kod wywołuje DeleteMessage bezpośrednio po przetworzeniu wiadomości. Wszystkie metody kolejkowania, które pokazaliśmy do tej pory, mają Async alternatywy.

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

Używaj asynchronicznych przepływów pracy z typowymi interfejsami API do przechowywania w kolejce

W tym przykładzie pokazano, jak używać asynchronicznego przepływu pracy z typowymi interfejsami API usługi Queue Storage.

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
}

Dodatkowe opcje usuwania komunikatów kolejkowania

Istnieją dwa sposoby dostosowania pobierania komunikatów z kolejki. Po pierwsze można uzyskać komunikaty zbiorczo (do 32). Po drugie można ustawić dłuższy lub krótszy limit czasu niewidoczności, dzięki czemu kod będzie mieć więcej lub mniej czasu na pełne przetworzenie każdego komunikatu. Poniższy przykład kodu używa ReceiveMessages do pobrania dwudziestu komunikatów w jednym wywołaniu i następnie przetwarza każdy komunikat. Ustawia również limitu czasu niewidoczności na pięć minut dla każdego komunikatu. 5-minutowy czas rozpoczyna się dla wszystkich komunikatów jednocześnie, więc po upływie 5 minut od wywołania ReceiveMessages wszystkie komunikaty, które nie zostały usunięte, staną się ponownie widoczne.

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

Pobierz długość kolejki

Możesz uzyskać oszacowanie liczby komunikatów w kolejce. Metoda GetProperties prosi usługę kolejkową o pobranie atrybutów kolejki, w tym liczbę wiadomości. Właściwość ApproximateMessagesCount zwraca ostatnią wartość pobraną przez metodę GetProperties .

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

Usuń kolejkę

Aby usunąć kolejkę i wszystkie zawarte w niej komunikaty, wywołaj metodę Delete w obiekcie kolejki.

queueClient.DeleteIfExists()

Uwaga

Jeśli migrujesz ze starych bibliotek, to domyślnie kodowały one komunikaty w formacie Base64, ale nowe biblioteki tego nie robią, ponieważ jest to bardziej wydajne. Aby uzyskać informacje na temat sposobu konfigurowania kodowania, zobacz MessageEncoding.

Zobacz też