如何通过 PowerShell 使用 Azure 队列存储

Azure 队列存储是一项可存储大量消息的服务,用户可以通过 HTTP 或 HTTPS 从世界任何地方访问这些消息。 有关详细信息,请参阅 Azure 队列存储简介。 此操作指南文章介绍常见的队列存储操作。 你将学习如何执行以下操作:

  • 创建队列
  • 检索队列
  • 添加消息
  • 检索消息
  • 删除消息
  • 删除队列

本操作说明指南需要 Azure PowerShell (Az) 模块 v12.0.0。 运行 Get-Module -ListAvailable Az 以查找当前安装的版本。 如果需要进行升级,请参阅 Install Azure PowerShell module(安装 Azure PowerShell 模块)。

队列的数据平面没有相应的 PowerShell cmdlet。 若要执行数据平面操作(如添加消息、读取消息和删除消息),必须使用 PowerShell 中公开的 .NET 存储客户端库。 创建消息对象,然后可以使用命令(例如 AddMessage)对该消息执行操作。 本文介绍如何执行该操作。

注意

建议使用 Azure Az PowerShell 模块与 Azure 交互。 请参阅安装 Azure PowerShell 以开始使用。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

登录 Azure

运行 Connect-AzAccount -EnvironmentName AzureChinaCloud 命令以登录 Azure 订阅,并按照屏幕上的说明操作。 如果需要,可以通过添加 TenantIdSubscription 参数并包括相应的值来指定订阅。

Connect-AzAccount -EnvironmentName AzureChinaCloud

检索位置列表

如果不知道要使用的位置,可以使用 Get-AzLocation cmdlet 列出可用位置,如提供的示例所示。 显示列表后,选择一个位置并将其存储在 location 变量中供将来使用。 本练习中的示例使用 chinaeast 位置。

Get-AzLocation | Select-Object Location
$location = "China East"

创建资源组

Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。 为资源组选择一个名称,并将其存储在 resourceGroup 变量中以供将来使用。 此示例使用名称 howtoqueuesrg

通过调用 New-AzResourceGroup cmdlet 并向 ResourceGroupName 参数提供名称和位置来创建资源组,如下所示。

$resourceGroup = "howtoqueuesrg"
New-AzResourceGroup -ResourceGroupName $resourceGroup -Location $location

创建存储帐户

Azure 存储帐户是一个唯一命名的资源,其中包含 blob、文件、队列和表形式的所有数据对象。

为存储帐户选择一个名称,并将其存储在 storageAccountName 变量中以供将来使用。 此示例使用名称 howtoqueuestorage

接下来,使用 New-AzStorageAccount cmdlet 创建具有本地冗余存储 (LRS) 的标准常规用途存储帐户。 最后,设置定义存储帐户的存储帐户上下文,将其保存到 ctx 变量。 通过使用变量引用上下文,可以针对存储帐户执行操作,而无需重复提供凭据。

$storageAccountName = "howtoqueuestorage"

$storageAccount = New-AzStorageAccount -ResourceGroupName $resourceGroup `
  -Name $storageAccountName `
  -Location $location `
  -SkuName Standard_LRS

$ctx = $storageAccount.Context

创建队列

首先,选择存储帐户的名称并将其存储在 queueName 变量中。 此示例使用名称 howtoqueuestorage。 接下来,使用 New-AzStorageQueue cmdlet 创建队列,并将 queueNamectx 变量传递给 NameContext 参数,如下所示。

$queueName = "howtoqueue"
$queue = New-AzStorageQueue -Name $queueName -Context $ctx

有关 Azure 队列存储的命名约定的信息,请参阅命名队列和元数据

检索队列

可以使用 Get-AzStorageQueue cmdlet 检索特定队列或存储帐户中所有队列的列表。 以下示例演示如何使用 Get-AzStorageQueue cmdlet 检索所有队列,以及如何使用 Name 参数指定队列。

# Retrieve all queues and show their names
Get-AzStorageQueue -Context $ctx | Select-Object Name

# Retrieve a specific queue
$queue = Get-AzStorageQueue -Name $queueName -Context $ctx

# Show the properties of the queue
$queue

向队列添加消息

影响队列中的消息的操作使用 PowerShell 中公开的 .NET 存储客户端库。 若要将消息添加到队列,请将消息以字符串的形式传递给 QueueClient 类的 SendMessage 的方法。

消息字符串必须采用 UTF-8 格式。

以下示例演示如何向队列中添加消息。

# Create a new message using a constructor of the CloudQueueMessage class
$queueMessage = "This is message 1"

# Add a new message to the queue
$queue.QueueClient.AddMessageAsync($queueMessage)

# Add two more messages to the queue
$queueMessages = @("This is message 2","This is message 3")
$queueMessages | foreach {$queue.QueueClient.AddMessageAsync($_)}

如果使用 Azure 存储资源管理器,可以连接到 Azure 帐户并查看存储帐户中的队列,然后在队列中向下钻取以查看队列中的消息。

从队列检索消息

信息是按最佳尝试、先进先出的顺序从队列中检索的,但不能完全保证

根据用例,可以从队列中检索一个或多个消息。 还可以修改消息的可见性,允许或阻止其他进程访问同一消息。

从队列中检索消息有两种方法:

  • Receive:使用 Receive 检索消息可将消息取消排队并递增其 DequeueCount 属性。 除非删除消息,否则它将重新插入队列中以再次进行处理。
  • Peek:使用检索 Peek 消息可从队列中“预览”消息。 Peek 不会将消息取消排队,也不会递增其 DequeueCount 属性。

接收消息

使用 ReceiveMessage 等方法从队列中读取消息时,消息会暂时取消排队,并暂时对其他进程不可见。 此可见性超时定义消息保持不可见的时长。 默认可见性超时为 30 秒。

如果在可见性超时过去之前未处理消息,则会递增其 DequeueCount 属性,并在队列末尾重新插入该消息。 重新插入相同的消息可确保另一个进程可以检索相同的消息并重试。

以下示例将 invisibleTimeout 变量设置为 10 秒,然后从队列中读取两条消息。

# Set the amount of time you want to entry to be invisible after read from the queue
# If it is not deleted by the end of this time, it will show up in the queue again
$visibilityTimeout = [System.TimeSpan]::FromSeconds(10)

# Read the message from the queue, then show the contents of the message. 
# Read the next message, too.
$queueMessage = $queue.QueueClient.ReceiveMessage($visibilityTimeout)
$queueMessage.Value
$queueMessage = $queue.QueueClient.ReceiveMessage($visibilityTimeout)
$queueMessage.Value

可以使用 ReceiveMessages 方法和传递整数值以指定要返回的最大消息数,同时从队列中检索多个消息。

# Set the amount of time you want to entry to be invisible after read from the queue
# If it is not deleted by the end of this time, it will show up in the queue again
$visibilityTimeout = [System.TimeSpan]::FromSeconds(10)

# Read the messages from the queue, then show the contents of the messages.
$queueMessage = $queue.QueueClient.ReceiveMessages(5,$visibilityTimeout)
$queueMessage.Value

速览消息

对于可能涉及共享队列或在不更改可见性的情况下预览消息的用例,可以使用 PeekMessagePeekMessages 方法。 与前面的 ReceiveMessages 示例一样,可以传递整数值以指定最大消息数,同时速览多个消息。

以下示例使用 PeekMessagePeekMessages 方法从队列中检索消息。

# Read the message from the queue, then show the contents of the message. 
$queueMessage = $queue.QueueClient.PeekMessage()
$queueMessage.Value

# Read the next four messages, then show the contents of the messages.
$queueMessage = $queue.QueueClient.PeekMessages(4)
$queueMessage.Value

从队列中删除消息

为了防止意外删除,必须先提供 MessageIdPopReceipt 属性,然后才能永久删除消息。 应此要求,最简单的方法是使用两步过程删除消息。

首先,通过调用 ReceiveMessageReceiveMessages 方法提取队列中的下一条消息。 若要完成从队列中删除消息,请将从消息获取的值传递给 DeleteMessage 方法。

以下示例演示了此过程。

# Set the amount of time you want to entry to be invisible after read from the queue
# If it is not deleted by the end of this time, it will show up in the queue again
$visibilityTimeout = [System.TimeSpan]::FromSeconds(10)

# Receive one message from the queue, then delete the message. 
$queueMessage = $queue.QueueClient.ReceiveMessage($visibilityTimeout)
$queue.QueueClient.DeleteMessage($queueMessage.Value.MessageId, $queueMessage.Value.PopReceipt)

# Receive four message from the queue, then delete the messages. 
$queueMessage = $queue.QueueClient.ReceiveMessages(4,$visibilityTimeout)
$queueMessage.Value | foreach { $queue.QueueClient.DeleteMessage($_.MessageId, $_.PopReceipt)}

删除队列

若要删除队列及其包含的所有消息,请调用 QueueClient 类的 Delete 方法。 以下示例演示如何删除本练习中使用的特定队列。

# Delete the queue
Remove-AzStorageQueue -Name $queueName -Context $ctx

清理资源

删除资源组以删除在本练习中创建的资产和资源。 在这种情况下,存储帐户和资源组本身也会被删除。

Remove-AzResourceGroup -Name $resourceGroup

后续步骤

本操作指南文章介绍了使用 PowerShell 进行队列存储管理的基本知识,其中包括如何:

  • 创建队列
  • 检索队列
  • 添加消息
  • 读取消息
  • 删除消息
  • 删除队列

Azure PowerShell 存储 cmdlet

Microsoft Azure 存储资源管理器