Sdílet prostřednictvím


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 okamžitě škálovat, aby splňovala poptávku. Tento článek popisuje základní kroky pro práci s frontou Azure Queue Storage.

V tomto kurzu se naučíte:

  • Vytvoření účtu Azure Storage
  • Vytvoření aplikace
  • Přidání klientských knihoven Azure
  • Přidání podpory pro asynchronní kód
  • Vytvoření fronty
  • Vložení zpráv do fronty
  • Vyřazení zpráv z fronty
  • Odstranění prázdné fronty
  • Kontrola argumentů příkazového řádku
  • Sestavte a spusťte aplikaci.

Požadavky

Vytvoření účtu Azure Storage

Nejprve vytvořte účet Azure Storage. Podrobné pokyny k vytvoření účtu úložiště najdete v tématu Vytvoření účtu úložiště. Jedná se o samostatný krok, který provedete po vytvoření bezplatného účtu Azure v rámci požadavků.

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" jazyka 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é složky QueueApp a sestavte aplikaci, abyste ověřili, že je vše 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 .

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

    dotnet add package Azure.Storage.Queues
    

Přidání příkazů using

  1. Z příkazového řádku v adresáři projektu zadejte code . a otevřete Visual Studio Code v aktuálním adresáři. Nechejte okno příkazového řádku otevřené. Později bude možné spustit další příkazy. 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 hned za using System; příkaz přidejte následující obory názvů. 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 pro asynchronní kód

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

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

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

Vytvoření fronty

Před voláním rozhraní API Azure musíte získat přihlašovací údaje z Azure Portal.

Zkopírování přihlašovacích údajů z webu Azure Portal

Když ukázková aplikace odešle požadavek do Služby Azure Storage, musí být autorizována. Pokud chcete žádost autorizovat, přidejte do aplikace přihlašovací údaje účtu úložiště jako připojovací řetězec. Přihlašovací údaje účtu úložiště zobrazíte takto:

  1. Přihlaste se k webu Azure Portal.

  2. Vyhledejte svůj účet úložiště.

  3. V podokně nabídek účtu úložiště v části Zabezpečení a sítě vyberte Přístupové klíče. Tady si můžete prohlédnout přístupové klíče účtu a úplný připojovací řetězec pro každý klíč.

    Snímek obrazovky znázorňující umístění nastavení přístupového klíče v Azure Portal

  4. V podokně Přístupové klíče vyberte Zobrazit klíče.

  5. V části key1 vyhledejte hodnotu Připojovací řetězec . Výběrem ikony Zkopírovat do schránky zkopírujte připojovací řetězec. Hodnotu připojovacího řetězce přidáte do proměnné prostředí v další části.

    Snímek obrazovky ukazující zkopírování připojovacího řetězce z webu Azure Portal

Konfigurace připojovacího řetězce úložiště

Po zkopírování připojovacího řetězce ho zapište do nové proměnné prostředí na místním počítači, na kterém aplikace běží. Proměnnou prostředí nastavíte tak, že otevřete okno konzoly a budete postupovat podle pokynů pro váš operační systém. Nahraďte <yourconnectionstring> skutečným připojovacím řetězcem.

setx AZURE_STORAGE_CONNECTION_STRING "<yourconnectionstring>"

Po přidání proměnné prostředí v systému Windows je nutné spustit novou instanci příkazového okna.

Restartujte programy

Po přidání proměnné prostředí restartujte všechny spuštěné programy, které budou potřebovat přečíst proměnnou prostředí. Než budete pokračovat, restartujte například vývojové prostředí nebo editor.

Přidání připojovacího řetězce do aplikace

Přidejte do aplikace připojovací řetězec, aby přístup k účtu úložiště.

  1. Přepněte zpět na Visual Studio Code.

  2. Main V metodě nahraďte Console.WriteLine("Hello, World"); kód následujícím řádkem, který získá připojovací řetězec z proměnné prostředí.

    string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
    
  3. Přidejte následující kód do Main pro vytvoření objektu fronty, který se později předá metodám odeslání a příjmu.

    QueueClient queue = new QueueClient(connectionString, "mystoragequeue");
    
  4. Soubor uložte.

Vložení zpráv do fronty

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

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

    Této metodě se předává odkaz na frontu. Nová fronta, pokud ještě neexistuje, se vytvoří voláním CreateIfNotExistsAsync. Potom přidá newMessage do fronty 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í hodnota TTL zprávy nastavená na 7 dnů. Pro hodnotu TTL (Time to Live) zprávy můžete zadat libovolné kladné číslo. Následující fragment kódu přidá zprávu, které nikdy nevyprší platnost.

    Pokud chcete přidat zprávu, které nevyprší platnost, použijte Timespan.FromSeconds(-1) ve volání na SendMessageAsyncadresu .

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

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 do kódování Base64 .

Vyřazení zpráv z fronty

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

  1. Přidejte do třídy Program novou metodu s názvem RetrieveNextMessageAsync .

    Tato metoda přijme zprávu z fronty voláním ReceiveMessagesAsynca předáním 1 prvního parametru, který načte pouze další zprávu ve frontě. Po přijetí zprávy ji odstraňte z fronty voláním DeleteMessageAsyncpříkazu .

    Když se do fronty odešle zpráva s verzí sady SDK starší než verze v12, automaticky se zakóduje do kódování Base64. Od verze 12 se tato funkce odebrala. Když načtete zprávu pomocí sady SDK v12, automaticky se dekóduje base64. Musíte explicitně dekódovat obsah 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. Soubor uložte.

Odstranění prázdné fronty

Osvědčeným postupem na konci projektu je zjistit, jestli vytvořené prostředky stále potřebujete. Prostředky, které necháte běžet, vás stojí peníze. Pokud fronta existuje, ale je prázdná, zeptejte se 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. Soubor uložte.

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. Spojením argumentů 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í. Voláním RetrieveNextMessageAsync metody načtěte další zprávu ve frontě.

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

  1. Rozbalte metodu Main , zkontrolujte argumenty příkazového řádku a počkejte na vstup uživatele.

    static async Task Main(string[] args)
    {
        string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
    
        QueueClient queue = new QueueClient(connectionString, "mystoragequeue");
    
        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. Soubor uložte.

Celý kód

Tady je kompletní výpis kódu pro tento projekt.

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

namespace QueueApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");

            QueueClient queue = new QueueClient(connectionString, "mystoragequeue");

            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.";
            }
        }
    }
}

Sestavte a spusťte aplikaci.

  1. Spuštěním následujícího příkazu dotnet z příkazového řádku v adresáři projektu sestavte projekt.

    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ěli byste vidět 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, abyste mohli přijmout a odebrat první zprávu ve frontě.

    dotnet run
    
  4. Pokračujte ve spuš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 výzva k jejímu odstranění.

    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ření fronty
  2. Přidání a odebrání zpráv z fronty
  3. Odstranění fronty Azure Queue Storage

Další informace najdete v rychlých startech pro Azure Queue Storage.

Související ukázky kódu s využitím zastaralých sad SDK rozhraní .NET verze 11.x najdete v tématu Ukázky kódu s využitím rozhraní .NET verze 11.x.