Kurz: Práce s frontami front azure Storage frontami 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é může přidat komponenta odesílatele a zpracovat je komponenta příjemce. Díky frontě se vaše aplikace může okamžitě škálovat podle poptávky. Tento článek ukazuje základní kroky pro práci s frontou azure queue Storage frontou.

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 asynchronního kódu
  • Vytvoření fronty
  • Vložení zpráv do fronty
  • Zprávy o vynětu z fronty
  • Odstranění prázdné fronty
  • Kontrola argumentů příkazového řádku
  • Sestavte a spusťte aplikaci.

Požadavky

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

Vytvoření účtu Azure Storage

Nejprve vytvořte Azure Storage účet. 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ý provedete po vytvoření bezplatného účtu Azure v požadavcích.

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í příkazu vytvořte novou konzolovou aplikaci s dotnet new názvem QueueApp . Tento příkaz vytvoří jednoduchý projekt "hello world" v jazyce 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 Azure Storage klientské knihovny do projektu 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 , aby code . se Visual Studio Code v aktuálním adresáři. Nechte 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ů jazyka C# požadovaných k sestavení a ladění, klikněte na tlačítko Ano.

  2. Otevřete zdrojový Program.cs soubor a hned za příkaz přidejte následující using System; obory názvů. Tato aplikace používá typy z těchto oborů názvů pro připojení 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 Main metodu tak, aby se spouštěl asynchronně. voidNahraďte async Task návratovou hodnotou.

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

Vytvoření fronty

Před voláním rozhraní API Azure je nutné 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 vytvoří požadavek na Azure Storage, musí být autorizována. Pokud chcete požadavek autorizovat, přidejte do aplikace přihlašovací údaje svého účtu úložiště jako připojovací řetězec. Pokud chcete zobrazit přihlašovací údaje účtu úložiště, postupujte 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 můžete zobrazit přístupové klíče účtu a úplný připojovací řetězec pro každý klíč.

    Snímek obrazovky znázorňuje, kde se nachází 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. Vyberte ikonu Zkopírovat do schránky a 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ý běží aplikace. 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.

Windows

setx AZURE_STORAGE_CONNECTION_STRING "<yourconnectionstring>"

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

Linux

export AZURE_STORAGE_CONNECTION_STRING="<yourconnectionstring>"

macOS

export AZURE_STORAGE_CONNECTION_STRING="<yourconnectionstring>"

Restartování programů

Po přidání proměnné prostředí restartujte všechny spuštěné programy, které budou muset proměnnou prostředí přečíst. Před pokračováním například restartujte 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 mohl přistupovat k účtu úložiště.

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

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

    string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
    
  3. Do souboru přidejte následující kód, který vytvoří objekt fronty, který se později předá metodám send a Main receive.

    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 InsertMessageAsync přidejte následující Program metodu.

    Této metodě se předá odkaz na frontu. Pokud fronta ještě neexistuje, vytvoří se voláním CreateIfNotExistsAsync metody . Potom přidá do newMessage 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 TT (Time to Live) pro zprávu nastavená na sedm dní. Pro hodnotu TT (Time to Live) zprávy 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 ve Timespan.FromSeconds(-1) volání SendMessageAsync .

    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 pomocí kódování UTF-8. Zpráva může mít velikost až 64 kB. Pokud zpráva obsahuje binární data, zakódujte zprávu ve formátu Base64.

Zprávy o vynětu 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 z fronty odstranit, aby se nezpracuje více než jednou.

  1. Do třídy přidejte RetrieveNextMessageAsync novou Program metodu s názvem .

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

    Když je zpráva odeslána do fronty s verzí sady SDK starší než v12, je automaticky kódována base64. Počínaje v12 se tato funkce odebrala. Když načítáte zprávu pomocí sady SDK v12, není automaticky dekódovaná pomocí Base64. Obsah musíte explicitně dekódovat 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í prázdnou frontu.

Je to osvědčený postup na konci projektu k určení, zda stále potřebujete prostředky, které jste vytvořili. Prostředky, které necháte běžet, vás stojí peníze. Pokud fronta existuje, ale je prázdná, požádejte uživatele, jestli ho chce odstranit.

  1. Rozbalte RetrieveNextMessageAsync metodu pro zahrnutí výzvy 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.

Vyhledat argumenty příkazového řádku

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

Pokud nejsou k dispozici žádné argumenty příkazového řádku, zkuste operaci načtení. Zavolejte RetrieveNextMessageAsync metodu pro načtení další zprávy ve frontě.

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

  1. Rozbalte Main metodu pro kontrolu argumentů příkazového řádku a počkejte na zadání 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

Zde 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. Z příkazového řádku v adresáři projektu spusťte následující příkaz dotnet pro sestavení projektu.

    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 k přijetí a odebrání první zprávy ve frontě.

    dotnet run
    
  4. Pokračujte v spouštění aplikace, dokud nebudou všechny zprávy odebrány. Pokud ho spustíte ještě jednou, zobrazí se zpráva s oznámením, že je fronta 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ření fronty
  2. Přidávání a odebírání zpráv z fronty
  3. odstranění fronty Azure Queue Storage

další informace najdete v rychlých startech k Azure Queue Storage.