Začínáme s Azure Queue Storage pomocí rozhraní .NET
Přehled
Azure Queue Storage poskytuje cloudové zasílání zpráv mezi součástmi aplikace. Při navrhování aplikací pro škálování jsou součásti aplikace často oddělené, aby se škálování šly nezávisle na sobě. Queue Storage zajišťuje asynchronní zasílání zpráv mezi komponentami aplikace bez ohledu na to, jestli běží v cloudu, na stolním počítači, na místním serveru nebo na mobilním zařízení. Queue Storage podporuje také správu asynchronních úloh a vytváření pracovních toků procesů.
O tomto kurzu
Tento kurz ukazuje, jak napsat kód .NET pro některé běžné scénáře pomocí azure queue Storage. Jsou například zahrnuty scénáře vytváření a odstraňování front a přidávání, čtení a odstraňování front zpráv.
Odhadovaný čas dokončení: 45 minut
Požadavky
Co je Queue Storage?
Azure Queue Storage je služba pro ukládání velkého počtu zpráv, ke které můžete získat přístup z jakéhokoli místa na světě prostřednictvím ověřených volání s využitím protokolu HTTP nebo HTTPS. Zpráva s jednou frontou může mít velikost až 64 kB a jedna fronta můžete obsahovat miliony zpráv, až do dosažení celkové kapacity účtu úložiště. Fronta úložiště se často používá k vytvoření nevyřízených položek pro asynchronní zpracování.
Služba front koncepty
Služba front Azure obsahuje následující komponenty:

Účet úložiště: Veškerý přístup ke službě Azure Storage se provádí prostřednictvím účtu úložiště. Další informace o účtech úložiště najdete v tématu Přehled účtu úložiště.
Fronta: Fronta obsahuje sadu zpráv. Všechny zprávy musí být ve frontě. Upozorňujeme, že název fronty musí být psaný malými písmeny. Informace o pojmenování front najdete v tématu Pojmenování front a metadata.
Zpráva: Zprávu v libovolném formátu o velikosti až 64 kB. Maximální doba, po kterou může zpráva zůstat ve frontě, je 7 dní. V případě verze 2017-07-29 nebo novější může být maximální doba do živého kladného čísla nebo-1, což znamená, že platnost zprávy nevyprší. Pokud je tento parametr vynechán, výchozí hodnota TTL (Time to Live) je sedm dní.
Formát adresy URL: Fronty jsou adresovatelné v následujícím formátu adresy URL: http://
<storage account>. Queue.Core.Windows.NET/<queue>Následující adresa URL odkazuje na frontu v diagramu:
http://myaccount.queue.core.windows.net/incoming-orders
Vytvoření účtu úložiště Azure
Nejjednodušší způsob, jak vytvořit první účet úložiště Azure, je pomocí Azure Portal. Další informace najdete v tématu Vytvoření účtu úložiště.
Účet úložiště Azure můžete vytvořit také pomocí prostředí Azure PowerShell, rozhraní příkazového řádku Azure nebo pomocí poskytovatele prostředků služby Azure Storage pro .NET.
Pokud nechcete v Azure v tuto chvíli vytvářet účet úložiště, můžete použít taky emulátor úložiště Azurite ke spuštění a testování kódu v místním prostředí. Další informace najdete v tématu použití emulátoru Azurite pro vývoj místních Azure Storage.
Nastavíte vývojové prostředí
Potom si nastavte vývojové prostředí v sadě Visual Studio, abyste byli připraveni vyzkoušet příklady kódů z této příručky.
Vytvoření projektu konzolové aplikace pro Windows
V sadě Visual Studio vytvořte novou konzolovou aplikaci pro Windows. Následující kroky ukazují, jak vytvořit konzolovou aplikaci v Visual Studio 2019. Kroky u ostatních verzí sady Visual Studio jsou podobné.
- Vyberte Soubor > Nový > Project
- Vyberte Platforma > Windows
- Vyberte Konzolová aplikace (.NET Framework).
- Vyberte Další.
- Do Project název aplikace zadejte název aplikace.
- Vyberte Vytvořit.
Všechny příklady kódu v tomto kurzu můžete přidat do metody Main() v souboru Program.cs vaší konzolové aplikace.
Klientskou knihovnu Azure Storage v libovolném typu aplikace .NET, včetně cloudové služby nebo webové aplikace Azure, a desktopových a mobilních aplikací. V této příručce použijeme konzolovou aplikaci kvůli zjednodušení.
Použití balíčku NuGet k instalaci požadovaných balíčků
K dokončení tohoto kurzu musíte v projektu odkazovat na následující čtyři balíčky:
- Knihovna Azure.Core pro .NET:Tento balíček poskytuje sdílené primitivy, abstrakce a pomocné nástroje pro moderní klientské knihovny sady .NET Azure SDK.
- Azure. Storage. Společná klientská knihovna pro .NET:Tento balíček poskytuje infrastrukturu sdílenou ostatními Azure Storage klientskými knihovnami.
- Azure. Storage. Klientská knihovna front pro .NET:Tento balíček umožňuje pracovat se službou Azure Queue Storage ukládání zpráv, ke kterým může klient přistupovat.
- System.Configuration.ConfigurationManager library for .NET: Tento balíček poskytuje přístup ke konfiguračním souborům pro klientské aplikace.
K získání těchto NuGet můžete použít následující. Postupujte takto:
- Klikněte pravým tlačítkem na projekt v Průzkumník řešení a zvolte Spravovat NuGet balíčky.
- Vyberte Procházet.
- Vyhledejte online
Azure.Storage.Queuesa vyberte Nainstalovat, aby se Azure Storage klientská knihovna a její závislosti. Tím se také nainstaluje Azure. Storage. Běžné knihovny a knihovny Azure.Core, které jsou závislostmi knihovny front. - Vyhledejte online
System.Configuration.ConfigurationManagera vyberte Nainstalovat, aby se Správce konfigurace.
Určení cílového prostředí
Ke spuštění příkladů z této příručky máte dvě možnosti prostředí:
- Svůj kód můžete spustit na účtu služby Azure Storage v cloudu.
- Svůj kód můžete spustit v emulátoru úložiště Azure. Azureite je místní prostředí, které emuluje Azure Storage účet v cloudu. Pokud je vaše aplikace ve vývoji, Je to bezplatná možnost pro testování a ladění kódu. Emulátor používá známý účet a klíč. Další informace najdete v tématu Použití emulátoru Azure pro místníAzure Storage a testování.
Poznámka
Pokud se chcete vyhnout nákladům spojeným se službou Azure Storage, můžete se zaměřit na emulátor úložiště. Pokud se ale rozhodnete cílit na účet Azure Storage v cloudu, budou náklady na provedení tohoto kurzu zanedbatelné.
Získání připojovacího řetězce úložiště
Klientská Azure Storage pro .NET podporuje použití připojovacího řetězce úložiště ke konfiguraci koncových bodů a přihlašovacích údajů pro přístup ke službám úložiště. Další informace najdete v tématu Správa přístupových klíčů k účtu úložiště.
Zkopírování přihlašovacích údajů z webu Azure Portal
Ukázkový kód potřebuje autorizovat přístup k vašemu účtu úložiště. Autorizaci provedete tak, že aplikaci poskytnete přihlašovací údaje svého účtu úložiště v podobě připojovacího řetězce. Zobrazení přihlašovacích údajů účtu úložiště:
Přejděte na Azure Portal.
Vyhledejte svůj účet úložiště.
V části Nastavení v přehledu účtu úložiště vyberte Přístupové klíče. Zobrazí se přístupové klíče vašeho účtu a také úplný připojovací řetězec pro jednotlivé klíče.
V části key1 vyhledejte hodnotu Připojovací řetězec a kliknutím na tlačítko Kopírovat zkopírujte připojovací řetězec. V dalším kroku přidáte hodnotu připojovacího řetězce do proměnné prostředí.

Další informace o připojovacích řetězcích najdete v tématu věnovaném konfiguraci připojovacího řetězce pro službu Azure Storage.
Poznámka
Klíč účtu úložiště je podobný kořenovému heslu vašeho účtu úložiště. Vždy klíč účtu úložiště pečlivě chraňte. Nedávejte ho jiným uživatelům, nezakódovávejte ho ani ho neukládejte do souboru ve formátu prostého textu, který je přístupný ostatním uživatelům. Pokud se domníváte, že klíč je ohrožený, vygenerujte ho znovu pomocí webu Azure Portal.
Připojovací řetězec úložiště se nejlépe uchovává v konfiguračním souboru. Pokud chcete konfigurovat připojovací řetězec, otevřete v sadě Visual Studio Průzkumníka řešení a v něm soubor app.config. Sem přidejte <appSettings> obsah elementu . Nahraďte connection-string hodnotou, kterou jste zkopírovaný ze svého účtu úložiště na portálu:
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<appSettings>
<add key="StorageConnectionString" value="connection-string" />
</appSettings>
</configuration>
Nastavení konfigurace může vypadat následovně:
<add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=storagesample;AccountKey=GMuzNHjlB3S9itqZJHHCnRkrokLkcSyW7yK9BRbGp0ENePunLPwBgpxV1Z/pVo9zpem/2xSHXkMqTHHLcx8XRA==EndpointSuffix=core.windows.net" />
Pokud chcete cílit na emulátor úložiště Azure, můžete použít zástupce, který se mapuje na známý název a klíč účtu. V takovém případě bude nastavení připojovacího řetězce vypadat následovně:
<add key="StorageConnectionString" value="UseDevelopmentStorage=true" />
Přidání direktiv using
Přidejte na začátek souboru Program.cs následující direktivy using:
using System; // Namespace for Console output
using System.Configuration; // Namespace for ConfigurationManager
using System.Threading.Tasks; // Namespace for Task
using Azure.Identity;
using Azure.Storage.Queues; // Namespace for Queue storage types
using Azure.Storage.Queues.Models; // Namespace for PeekedMessage
Vytvoření klienta queue Storage
Třída QueueClient umožňuje načíst fronty uložené ve frontě Storage. Tady je jeden ze způsobů, jak vytvořit klienta služby:
//-------------------------------------------------
// Create the queue service client
//-------------------------------------------------
public void CreateQueueClient(string queueName)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instantiate a QueueClient which will be used to create and manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);
}
Teď jste připraveni napsat kód, který čte data z fronty a zapisuje je do fronty Storage.
Vytvoření fronty
Tento příklad ukazuje, jak vytvořit frontu:
//-------------------------------------------------
// Create a message queue
//-------------------------------------------------
public bool CreateQueue(string queueName)
{
try
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instantiate a QueueClient which will be used to create and manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);
// Create the queue
queueClient.CreateIfNotExists();
if (queueClient.Exists())
{
Console.WriteLine($"Queue created: '{queueClient.Name}'");
return true;
}
else
{
Console.WriteLine($"Make sure the Azurite storage emulator running and try again.");
return false;
}
}
catch (Exception ex)
{
Console.WriteLine($"Exception: {ex.Message}\n\n");
Console.WriteLine($"Make sure the Azurite storage emulator running and try again.");
return false;
}
}
Vložení zprávy do fronty
Pokud chcete vložit zprávu do existující fronty, zavolejte SendMessage metodu . Zpráva může být buď řetězec (ve formátu UTF-8), nebo pole bajtů. Následující kód vytvoří frontu (pokud neexistuje) a vloží zprávu:
//-------------------------------------------------
// Insert a message into a queue
//-------------------------------------------------
public void InsertMessage(string queueName, string message)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instantiate a QueueClient which will be used to create and manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);
// Create the queue if it doesn't already exist
queueClient.CreateIfNotExists();
if (queueClient.Exists())
{
// Send a message to the queue
queueClient.SendMessage(message);
}
Console.WriteLine($"Inserted: {message}");
}
Zobrazení náhledu další zprávy
Můžete prohlížet zprávy ve frontě, aniž byste je odebírali z fronty voláním PeekMessages metody . Pokud předáte hodnotu parametru , ve výchozím nastavení se zobrazí maxMessages náhled jedné zprávy.
//-------------------------------------------------
// Peek at a message in the queue
//-------------------------------------------------
public void PeekMessage(string queueName)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);
if (queueClient.Exists())
{
// Peek at the next message
PeekedMessage[] peekedMessage = queueClient.PeekMessages();
// Display the message
Console.WriteLine($"Peeked message: '{peekedMessage[0].Body}'");
}
}
Změna obsahu zpráv zařazených ve frontě
Podle potřeby můžete změnit obsah zprávy přímo ve frontě. Pokud zpráva představuje pracovní úlohu, mohli byste tuto funkci použít k aktualizaci stavu pracovních úloh. Následující kód aktualizuje zprávy ve frontě o nový obsah a prodlouží časový limit viditelnosti na 60 sekund. Uloží se tím stav práce spojený se zprávou a klient získá další minutu, aby mohl pokračovat ve zpracování zprávy. Tuto techniku můžete použít ke sledování vícekrokové pracovní postupy ve zprávách fronty, aniž byste museli začít znovu od začátku, pokud krok zpracování selže z důvodu selhání hardwaru nebo softwaru. Obvykle byste udržovali také hodnotu počtu opakování, a pokud by se pokus o zpracování zprávy opakoval více než n krát, odstranili byste ji. Je to ochrana proti tomu, aby zpráva při každém pokusu o zpracování nevyvolala chyby aplikace.
//-------------------------------------------------
// Update an existing message in the queue
//-------------------------------------------------
public void UpdateMessage(string queueName)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);
if (queueClient.Exists())
{
// Get the message from the queue
QueueMessage[] message = queueClient.ReceiveMessages();
// Update the message contents
queueClient.UpdateMessage(message[0].MessageId,
message[0].PopReceipt,
"Updated contents",
TimeSpan.FromSeconds(60.0) // Make it invisible for another 60 seconds
);
}
}
Vyřadí další zprávu z fronty.
Ve dvou krocích zprávu z fronty zrušte. Když zavoláte ReceiveMessages , zobrazí se další zpráva ve frontě. Zpráva vrácená z se ReceiveMessages stane neviditelnou pro jakýkoli jiný kód, který čte zprávy z této fronty. Ve výchozím nastavení tato zpráva zůstává neviditelná po dobu 30 sekund. Pokud chcete dokončit odebrání zprávy z fronty, musíte také zavolat DeleteMessage . Tento dvoukrokový proces odebrání zprávy zaručuje, aby v případě, že se vašemu kódu nepodaří zprávu zpracovat z důvodu selhání hardwaru nebo softwaru, mohla stejnou zprávu získat jiná instance vašeho kódu a bylo možné to zkusit znovu. Váš kód DeleteMessage volá hned po zpracování zprávy.
//-------------------------------------------------
// Process and remove a message from the queue
//-------------------------------------------------
public void DequeueMessage(string queueName)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);
if (queueClient.Exists())
{
// Get the next message
QueueMessage[] retrievedMessage = queueClient.ReceiveMessages();
// Process (i.e. print) the message in less than 30 seconds
Console.WriteLine($"Dequeued message: '{retrievedMessage[0].Body}'");
// Delete the message
queueClient.DeleteMessage(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
}
}
Použití vzoru Async-Await s běžnými rozhraními API pro Storage front
Tento příklad ukazuje, jak používat vzor Async-Await s běžnými rozhraními API pro Storage front. Ukázka volá asynchronní verzi každé dané metody, jak je označeno Async příponou každé metody. Při použití asynchronní metody pozastaví vzor Async-Await provádění, dokud se volání nedokončí. Toto chování umožňuje aktuálnímu vláknu provádět další činnosti, což pomáhá zabránit vzniku kritických bodů z hlediska výkonu a zlepšuje celkovou rychlost reakce aplikace. Další podrobnosti o použití vzoru Async-Await v .NET najdete v tématu Async a Await (C# a Visual Basic)
//-------------------------------------------------
// Perform queue operations asynchronously
//-------------------------------------------------
public async Task QueueAsync(string queueName)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);
// Create the queue if it doesn't already exist
await queueClient.CreateIfNotExistsAsync();
if (await queueClient.ExistsAsync())
{
Console.WriteLine($"Queue '{queueClient.Name}' created");
}
else
{
Console.WriteLine($"Queue '{queueClient.Name}' exists");
}
// Async enqueue the message
await queueClient.SendMessageAsync("Hello, World");
Console.WriteLine($"Message added");
// Async receive the message
QueueMessage[] retrievedMessage = await queueClient.ReceiveMessagesAsync();
Console.WriteLine($"Retrieved message with content '{retrievedMessage[0].Body}'");
// Async delete the message
await queueClient.DeleteMessageAsync(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
Console.WriteLine($"Deleted message: '{retrievedMessage[0].Body}'");
// Async delete the queue
await queueClient.DeleteAsync();
Console.WriteLine($"Deleted queue: '{queueClient.Name}'");
}
Použití dalších možností pro dequeuing zpráv
Načítání zpráv z fronty si můžete přizpůsobit dvěma způsoby. Za prvé si můžete načíst dávku zpráv (až 32). Za druhé si můžete nastavit delší nebo kratší časový limit neviditelnosti, aby měl váš kód více nebo méně času na úplné zpracování jednotlivých zpráv.
Následující příklad kódu používá ReceiveMessages metodu k získání 20 zpráv v jednom volání. Pak každou zprávu zpracuje pomocí foreach smyčky . Také se pro každou zprávu nastaví časový limit neviditelnosti 5 minut. Všimněte si, že pět minut začíná pro všechny zprávy najednou, takže po uplynutí pěti minut od volání metody se všechny zprávy, které nebyly odstraněny, znovu ReceiveMessages zobrazí.
//-----------------------------------------------------
// Process and remove multiple messages from the queue
//-----------------------------------------------------
public void DequeueMessages(string queueName)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);
if (queueClient.Exists())
{
// Receive and process 20 messages
QueueMessage[] receivedMessages = queueClient.ReceiveMessages(20, TimeSpan.FromMinutes(5));
foreach (QueueMessage message in receivedMessages)
{
// Process (i.e. print) the messages in less than 5 minutes
Console.WriteLine($"De-queued message: '{message.Body}'");
// Delete the message
queueClient.DeleteMessage(message.MessageId, message.PopReceipt);
}
}
}
Získání délky fronty
Podle potřeby můžete získat odhadovaný počet zpráv ve frontě. Metoda GetProperties vrátí vlastnosti fronty včetně počtu zpráv. Vlastnost ApproximateMessagesCount obsahuje přibližný počet zpráv ve frontě. Toto číslo není nižší než skutečný počet zpráv ve frontě, ale může být vyšší.
//-----------------------------------------------------
// Get the approximate number of messages in the queue
//-----------------------------------------------------
public void GetQueueLength(string queueName)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);
if (queueClient.Exists())
{
QueueProperties properties = queueClient.GetProperties();
// Retrieve the cached approximate message count.
int cachedMessagesCount = properties.ApproximateMessagesCount;
// Display number of messages.
Console.WriteLine($"Number of messages in queue: {cachedMessagesCount}");
}
}
Odstranění fronty
Pokud chcete odstranit frontu a všechny zprávy, které obsahuje, zavolejte Delete metodu pro objekt fronty.
//-------------------------------------------------
// Delete the queue
//-------------------------------------------------
public void DeleteQueue(string queueName)
{
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);
if (queueClient.Exists())
{
// Delete the queue
queueClient.Delete();
}
Console.WriteLine($"Queue deleted: '{queueClient.Name}'");
}
Další kroky
Teď, když jste se naučili základy služby Queue Storage, použijte tyto odkazy a seznamte se se složitějšími úkoly úložiště.
- Úplné podrobnosti o dostupných Storage api najdete v referenční dokumentaci k frontám:
- Projděte si další průvodce funkcemi, kde najdete další informace o dalších možnostech pro ukládání dat v Azure.
- Začínáme se službou Azure Table Storage k ukládání strukturovaných dat pomocí .NET.
- Začínáme s azure blob Storage k ukládání nestrukturovaných dat pomocí .NET.
- Připojení k SQL Database s použitím rozhraní .NET (C#) pro uložení relačních dat
- naučte se, jak zjednodušit psaní kódu pro práci s Azure Storage pomocí sady Azure WebJobs SDK.