Kurz: Práce s frontami Azure Queue Storage v .NET

Azure Queue Storage implementuje cloudové fronty, které umožňují komunikaci mezi komponentami distribuované aplikace. Každá fronta udržuje seznam zpráv, které mohou být přidány komponentou odesílatele a zpracovány komponentou příjemce. Díky frontě se vaše aplikace může škálovat okamžitě, aby splňovala poptávku. Tento článek popisuje základní kroky pro práci s frontou Azure Queue Storage.

V tomto návodu se naučíte, jak:

  • Vytvoření účtu služby Azure Storage
  • Vytvoření aplikace
  • Přidání klientských knihoven Azure
  • Přidání podpory asynchronního kódu
  • Vytvořit frontu
  • Vložení zpráv do fronty
  • Vyřazení zpráv z fronty
  • Odstraňte prázdnou frontu
  • Kontrola argumentů příkazového řádku
  • Sestavení a spuštění aplikace

Prerequisites

  • Získejte bezplatnou kopii editoru Visual Studio Code pro různé platformy.
  • Stáhněte a nainstalujte sadu .NET Core SDK verze 3.1 nebo novější.
  • Pokud nemáte aktuální předplatné Azure, vytvořte si před tím, než začnete, bezplatný účet.

Vytvoření účtu služby Azure Storage

  1. Nejprve vytvořte účet Azure Storage.

    Podrobný průvodce vytvořením účtu úložiště najdete v tématu Vytvoření účtu úložiště. Jedná se o samostatný krok, který se provádí po vytvoření bezplatného účtu Azure v rámci předpokladů.

  2. Ujistěte se, že má váš uživatelský účet přiřazenou roli Přispěvatel dat fronty úložiště, zaměřenou na účet úložiště, skupinu rodičovských prostředků nebo předplatné. Viz Ověření v Azure.

Vytvoření aplikace

Vytvořte aplikaci .NET Core s názvem QueueApp. Pro zjednodušení bude tato aplikace odesílat i přijímat zprávy prostřednictvím fronty.

  1. V okně konzoly (například cmd, PowerShell nebo Azure CLI) pomocí dotnet new příkazu vytvořte novou konzolovou aplikaci s názvem QueueApp. Tento příkaz vytvoří jednoduchý projekt "hello world" C# s jedním zdrojovým souborem s názvem Program.cs.

    dotnet new console -n QueueApp
    
  2. Přepněte do nově vytvořené QueueApp složky a sestavte aplikaci, abyste ověřili, že je všechno v pořádku.

    cd QueueApp
    
    dotnet build
    

    Měly by se zobrazit výsledky podobné následujícímu výstupu:

    C:\Tutorials>dotnet new console -n QueueApp
    The template "Console Application" was created successfully.
    
    Processing post-creation actions...
    Running 'dotnet restore' on QueueApp\QueueApp.csproj...
      Restore completed in 155.63 ms for C:\Tutorials\QueueApp\QueueApp.csproj.
    
    Restore succeeded.
    
    C:\Tutorials>cd QueueApp
    
    C:\Tutorials\QueueApp>dotnet build
    Microsoft (R) Build Engine version 16.0.450+ga8dc7f1d34 for .NET Core
    Copyright (C) Microsoft Corporation. All rights reserved.
    
      Restore completed in 40.87 ms for C:\Tutorials\QueueApp\QueueApp.csproj.
      QueueApp -> C:\Tutorials\QueueApp\bin\Debug\netcoreapp3.1\QueueApp.dll
    
    Build succeeded.
        0 Warning(s)
        0 Error(s)
    
    Time Elapsed 00:00:02.40
    
    C:\Tutorials\QueueApp>_
    

Přidání klientských knihoven Azure

  1. Přidejte do projektu klientské knihovny Azure Storage pomocí dotnet add package příkazu.

    V okně konzoly spusťte následující příkaz ze složky projektu.

    dotnet add package Azure.Storage.Queues
    

Přidejte příkazy using

  1. Z příkazového řádku v adresáři projektu zadejte code . pro otevření Visual Studio Code v aktuálním adresáři. Nechte okno příkazového řádku otevřené. Později bude k dispozici více příkazů. Pokud se zobrazí výzva k přidání prostředků C# potřebných k sestavení a ladění, klikněte na tlačítko Ano .

  2. Program.cs Otevřete zdrojový soubor a přidejte následující obory názvů hned po using System; příkazu. Tato aplikace používá typy z těchto oborů názvů pro připojení ke službě Azure Storage a práci s frontami.

    using System.Threading.Tasks;
    using Azure.Storage.Queues;
    using Azure.Storage.Queues.Models;
    
  3. Uložte soubor Program.cs.

Přidání podpory asynchronního kódu

Vzhledem k tomu, že aplikace používá cloudové prostředky, kód běží asynchronně.

  1. Aktualizujte metodu Main tak, aby běžela asynchronně. Nahraďte void vrácenou async Task hodnotou.

    static async Task Main(string[] args)
    
  2. Uložte soubor Program.cs.

Vytvořit frontu

Před voláním do rozhraní API Azure musíte zajistit, abyste byli ověřeni pomocí stejného účtu Microsoft Entra, ke kterému jste přiřadili roli. Po ověření můžete pomocí QueueClient vytvořit a autorizovat objekt DefaultAzureCredential pro přístup k datům fronty v účtu úložiště. DefaultAzureCredential automaticky zjistí a použije účet, ke který jste se přihlásili. Informace o tom, jak se přihlásit a pak vytvořit QueueClient objekt, najdete v tématu Autorizace přístupu a vytvoření objektu klienta.

Vložení zpráv do fronty

Vytvořte novou metodu pro odeslání zprávy do fronty.

  1. Do třídy přidejte následující InsertMessageAsync metodu Program .

    Metodě se předává odkaz na frontu. Vytvoří se nová fronta, pokud ještě neexistuje, zavoláním CreateIfNotExistsAsync. Potom přidá do fronty newMessage voláním SendMessageAsync.

    static async Task InsertMessageAsync(QueueClient theQueue, string newMessage)
    {
        if (null != await theQueue.CreateIfNotExistsAsync())
        {
            Console.WriteLine("The queue was created.");
        }
    
        await theQueue.SendMessageAsync(newMessage);
    }
    
  2. Volitelný: Ve výchozím nastavení je maximální doba přenosu zprávy nastavená na sedm dnů. Pro zprávu time-to-live můžete zadat libovolné kladné číslo. Následující fragment kódu přidá zprávu, která nikdy nevyprší .

    Pokud chcete přidat zprávu, která nevyprší, použijte Timespan.FromSeconds(-1) v vašem volání SendMessageAsync.

    await theQueue.SendMessageAsync(newMessage, default, TimeSpan.FromSeconds(-1), default);
    
  3. Uložte soubor.

Zpráva fronty musí být ve formátu kompatibilním s požadavkem XML s kódováním UTF-8. Zpráva může mít velikost až 64 kB. Pokud zpráva obsahuje binární data, zakódujte zprávu kódováním Base64 .

Vyřazení zpráv z fronty

Vytvořte novou metodu pro získání zprávy z fronty. Po úspěšném přijetí zprávy je důležité ji odstranit z fronty, aby se nezpracovala vícekrát.

  1. Přidejte do třídy RetrieveNextMessageAsync novou metodu volanouProgram.

    Tato metoda přijme zprávu z fronty zavoláním ReceiveMessagesAsync, přičemž do prvního parametru předá 1 k načtení jen další zprávy ve frontě. Po přijetí zprávy ji odstraňte z fronty voláním DeleteMessageAsync.

    Při odeslání zprávy do fronty s verzí sady SDK před v12 je automaticky zakódována pomocí Base64. Od verze 12 se tato funkce odebrala. Při načtení zprávy pomocí sady SDK v12 se Base64 automaticky nedekóduje. Obsah musíte explicitně dekódovat Base64 sami.

    static async Task<string> RetrieveNextMessageAsync(QueueClient theQueue)
    {
        if (await theQueue.ExistsAsync())
        {
            QueueProperties properties = await theQueue.GetPropertiesAsync();
    
            if (properties.ApproximateMessagesCount > 0)
            {
                QueueMessage[] retrievedMessage = await theQueue.ReceiveMessagesAsync(1);
                string theMessage = retrievedMessage[0].Body.ToString();
                await theQueue.DeleteMessageAsync(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
                return theMessage;
            }
    
            return null;
        }
    
        return null;
    }
    
  2. Uložte soubor.

Odstraňte prázdnou frontu

Osvědčeným postupem na konci projektu je zjistit, jestli stále potřebujete prostředky, které jste vytvořili. Prostředky ponechané v provozu mohou způsobit výdaje. Pokud fronta existuje, ale je prázdná, požádejte uživatele, jestli ji chce odstranit.

  1. Rozbalte metodu RetrieveNextMessageAsync tak, aby obsahovala výzvu k odstranění prázdné fronty.

    static async Task<string> RetrieveNextMessageAsync(QueueClient theQueue)
    {
        if (await theQueue.ExistsAsync())
        {
            QueueProperties properties = await theQueue.GetPropertiesAsync();
    
            if (properties.ApproximateMessagesCount > 0)
            {
                QueueMessage[] retrievedMessage = await theQueue.ReceiveMessagesAsync(1);
                string theMessage = retrievedMessage[0].Body.ToString();
                await theQueue.DeleteMessageAsync(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
                return theMessage;
            }
            else
            {
                Console.Write("The queue is empty. Attempt to delete it? (Y/N) ");
                string response = Console.ReadLine();
    
                if (response.ToUpper() == "Y")
                {
                    await theQueue.DeleteIfExistsAsync();
                    return "The queue was deleted.";
                }
                else
                {
                    return "The queue was not deleted.";
                }
            }
        }
        else
        {
            return "The queue does not exist. Add a message to the command line to create the queue and store the message.";
        }
    }
    
  2. Uložte soubor.

Kontrola argumentů příkazového řádku

Pokud jsou do aplikace předány nějaké argumenty příkazového řádku, předpokládejme, že se jedná o zprávu, která se má přidat do fronty. Spojte argumenty dohromady a vytvořte řetězec. Přidejte tento řetězec do fronty zpráv voláním InsertMessageAsync metody, kterou jsme přidali dříve.

Pokud neexistují žádné argumenty příkazového řádku, zkuste operaci načtení. Zavolejte metodu RetrieveNextMessageAsync pro načtení další zprávy z fronty.

Nakonec počkejte na vstup uživatele před ukončením voláním Console.ReadLine.

  1. Rozbalte metodu Main , abyste zkontrolovali argumenty příkazového řádku a čekali na vstup uživatele. V následujícím fragmentu kódu nezapomeňte nahradit zástupný symbol {storageAccountName} názvem vašeho účtu úložiště.

    static async Task Main(string[] args)
    {
       QueueClient queue = new QueueClient(
          new Uri($"https://{storageAccountName}.queue.core.windows.net/mystoragequeue"),
          new DefaultAzureCredential());
    
       if (args.Length > 0)
       {
          string value = String.Join(" ", args);
          await InsertMessageAsync(queue, value);
          Console.WriteLine($"Sent: {value}");
       }
       else
       {
          string value = await RetrieveNextMessageAsync(queue);
          Console.WriteLine($"Received: {value}");
       }
    
       Console.Write("Press Enter...");
       Console.ReadLine();
    }
    
  2. Uložte soubor.

Kompletní kód

Tady je úplný výpis kódu pro tento projekt.

using System;
using System.Threading.Tasks;
using Azure.Storage.Queues;
using Azure.Storage.Queues.Models;
using Azure.Identity;

namespace QueueApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            QueueClient queue = new QueueClient(
               new Uri($"https://{storageAccountName}.queue.core.windows.net/mystoragequeue"),
               new DefaultAzureCredential());

            if (args.Length > 0)
            {
                string value = String.Join(" ", args);
                await InsertMessageAsync(queue, value);
                Console.WriteLine($"Sent: {value}");
            }
            else
            {
                string value = await RetrieveNextMessageAsync(queue);
                Console.WriteLine($"Received: {value}");
            }

            Console.Write("Press Enter...");
            Console.ReadLine();
        }

        static async Task InsertMessageAsync(QueueClient theQueue, string newMessage)
        {
            if (null != await theQueue.CreateIfNotExistsAsync())
            {
                Console.WriteLine("The queue was created.");
            }

            await theQueue.SendMessageAsync(newMessage);
        }

        static async Task<string> RetrieveNextMessageAsync(QueueClient theQueue)
        {
            if (await theQueue.ExistsAsync())
            {
                QueueProperties properties = await theQueue.GetPropertiesAsync();

                if (properties.ApproximateMessagesCount > 0)
                {
                    QueueMessage[] retrievedMessage = await theQueue.ReceiveMessagesAsync(1);
                    string theMessage = retrievedMessage[0].Body.ToString();
                    await theQueue.DeleteMessageAsync(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
                    return theMessage;
                }
                else
                {
                    Console.Write("The queue is empty. Attempt to delete it? (Y/N) ");
                    string response = Console.ReadLine();

                    if (response.ToUpper() == "Y")
                    {
                        await theQueue.DeleteIfExistsAsync();
                        return "The queue was deleted.";
                    }
                    else
                    {
                        return "The queue was not deleted.";
                    }
                }
            }
            else
            {
                return "The queue does not exist. Add a message to the command line to create the queue and store the message.";
            }
        }
    }
}

Sestavení a spuštění aplikace

  1. Z příkazového řádku v adresáři projektu spusťte následující příkaz dotnet, který projekt sestaví.

    dotnet build
    
  2. Po úspěšném sestavení projektu spusťte následující příkaz, který přidá první zprávu do fronty.

    dotnet run First queue message
    

    Měl by se zobrazit tento výstup:

    C:\Tutorials\QueueApp>dotnet run First queue message
    The queue was created.
    Sent: First queue message
    Press Enter..._
    
  3. Spusťte aplikaci bez argumentů příkazového řádku, aby přijímala a odebírala první zprávu ve frontě.

    dotnet run
    
  4. Pokračujte ve spouštění aplikace, dokud se neodeberou všechny zprávy. Pokud ji spustíte ještě jednou, zobrazí se zpráva, že fronta je prázdná, a zobrazí se výzva k odstranění fronty.

    C:\Tutorials\QueueApp>dotnet run First queue message
    The queue was created.
    Sent: First queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run Second queue message
    Sent: Second queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run Third queue message
    Sent: Third queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run
    Received: First queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run
    Received: Second queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run
    Received: Third queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run
    The queue is empty. Attempt to delete it? (Y/N) Y
    Received: The queue was deleted.
    Press Enter...
    
    C:\Tutorials\QueueApp>_
    

Další kroky

V tomto kurzu jste se naučili:

  1. Vytvořit frontu
  2. Přidání a odebrání zpráv z fronty
  3. Odstranit frontu Azure Queue Storage

Další informace najdete v rychlých startech služby Azure Queue Storage.

Související ukázky kódu s využitím zastaralých sad .NET verze 11.x najdete v ukázkách kódu pomocí .NET verze 11.x.