如何通过 Ruby 使用队列存储

小提示

尝试Microsoft Azure 存储资源管理器

Microsoft Azure 存储资源管理器 是一款免费的独立应用,来自 Microsoft,可用于在 Windows、macOS 和 Linux 上直观地处理 Azure 存储数据。

概述

本指南介绍如何使用 Microsoft Azure 队列存储服务执行常见方案。 这些示例是使用 Ruby Azure API 编写的。 涵盖的方案包括 插入速览获取删除 队列消息,以及 创建和删除队列

什么是队列存储?

Azure 队列存储是一项服务,用于存储大量可以通过 HTTP 或 HTTPS 通过经过身份验证的调用从世界上任何地方访问的消息。 单个队列消息的大小最多可为 64 KB,队列可以包含数以百万计的消息,消息总量取决于存储帐户的容量上限。 队列存储通常用于创建积压工作以异步处理。

队列服务概念

Azure 队列服务包含以下组件:

Azure 队列服务组件

  • 存储帐户: 对 Azure 存储的所有访问都通过存储帐户完成。 有关存储帐户的详细信息,请参阅 存储帐户概述

  • 队列: 队列包含一组消息。 所有消息必须位于相应的队列中。 请注意,队列名称必须全部小写。 有关命名队列的信息,请参阅 命名队列和元数据

  • 消息: 以任意格式显示的消息,最大为 64 KB。 消息可以保留在队列中的最长时间为 7 天。 在 2017-07-29 或更高版本中,最大生存时间可以是任何正数,或者是 -1(表示消息不会过期)。 如果省略此参数,则默认的生存时间为 7 天。

  • URL 格式: 队列使用以下 URL 格式进行寻址:http://<storage account>.queue.core.windows.net/<queue>

    以下 URL 指向图示中的队列:

    http://myaccount.queue.core.windows.net/incoming-orders

创建 Azure 存储帐户

创建第一个 Azure 存储帐户的最简单方法是使用 Azure 门户。 若要了解详细信息,请参阅 “创建存储帐户”。

还可以使用 Azure PowerShellAzure CLI用于 .NET 的 Azure 存储资源提供程序创建 Azure 存储帐户。

如果目前不想在 Azure 中创建存储帐户,也可以使用 Azurite 存储模拟器在本地环境中运行和测试代码。 有关详细信息,请参阅 使用 Azurite 模拟器进行本地 Azure 存储开发

创建 Ruby 应用程序

创建 Ruby 应用程序。 有关说明,请参阅 在 Linux 上的应用服务中创建 Ruby 应用程序

配置应用程序以访问存储

若要使用 Azure 存储,需要下载并使用 Ruby Azure 包,其中包括一组与存储 REST 服务通信的便利库。

使用 RubyGems 获取软件包

  1. 使用命令行接口,例如 PowerShell(Windows)、终端(Mac)或 Bash (Unix)。
  2. 在命令窗口中键入 gem install azure 以安装 gem 和依赖项。

导入包

使用你喜欢的文本编辑器,将以下内容添加到要在其中使用存储的 Ruby 文件顶部:

require "azure"

设置 Azure 存储连接

Azure 模块将读取环境变量 AZURE_STORAGE_ACCOUNTAZURE_STORAGE_ACCESS_KEY 中的连接到 Azure 存储帐户所需的信息。 如果未设置这些环境变量,则必须在使用以下 Azure::QueueService 代码之前指定帐户信息:

Azure.config.storage_account_name = "<your azure storage account>"
Azure.config.storage_access_key = "<your Azure storage access key>"

若要从 Azure 门户中的经典存储帐户或资源管理器存储帐户获取这些值,请执行以下作:

  1. 登录到 Azure 门户
  2. 导航到要使用的存储帐户。
  3. 在右侧的 “设置” 边栏选项卡中,单击“ 访问密钥”。
  4. 在显示的 “访问密钥 ”边栏选项卡中,你将看到访问密钥 1 和访问密钥 2。 可以使用其中任一项。
  5. 单击复制图标将密钥复制到剪贴板。

如何:创建队列

以下代码创建一个 Azure::QueueService 对象,使你能够处理队列。

azure_queue_service = Azure::QueueService.new

create_queue()使用该方法创建具有指定名称的队列。

begin
  azure_queue_service.create_queue("test-queue")
rescue
  puts $!
end

如何:将消息插入队列

若要将消息插入队列,请使用 create_message() 该方法创建新消息并将其添加到队列。

azure_queue_service.create_message("test-queue", "test message")

如何查看下一条消息

可以通过调用 peek_messages() 该方法来查看队列前面的消息,而无需将其从队列中删除。 默认情况下,peek_messages() 扫视单条消息。 还可以指定要查看的消息数。

result = azure_queue_service.peek_messages("test-queue",
  {:number_of_messages => 10})

如何出列下一条消息

可以通过两个步骤从队列中删除消息。

  1. 调用 list_messages()时,默认情况下会获取队列中的下一条消息。 还可以指定要获取的消息数。 从 list_messages() 中返回的消息对从此队列读取消息的任何其他代码都不可见。 您可以将可见性超时(以秒为单位)作为参数传入。
  2. 要完成从队列中移除消息,还必须调用 delete_message()

删除消息的这两个步骤可确保当代码因硬件或软件故障而无法处理消息时,代码的另一个实例可以获取相同的消息,然后重试。 代码在处理完消息后立即调用 delete_message()

messages = azure_queue_service.list_messages("test-queue", 30)
azure_queue_service.delete_message("test-queue",
  messages[0].id, messages[0].pop_receipt)

如何:更改排队消息的内容

可以直接在队列中更改消息内容。 以下代码使用 update_message() 方法更新消息。 该方法将返回一个元组,其中包含队列消息的弹出回执,以及表示消息在队列上何时可见的 UTC DateTime 值。

message = azure_queue_service.list_messages("test-queue", 30)
pop_receipt, time_next_visible = azure_queue_service.update_message(
  "test-queue", message.id, message.pop_receipt, "updated test message",
  30)

如何:取消排队消息的其他选项

可通过两种方式自定义队列中的消息检索。

  1. 你可以获取一批消息。
  2. 可以设置更长或更短的不可见超时,使代码可以多或少地完全处理每条消息。

下面的代码示例使用 list_messages() 该方法在一次调用中获取 15 条消息。 然后,它会打印并删除每条消息。 它还将每条消息的不可见超时设置为 5 分钟。

azure_queue_service.list_messages("test-queue", 300
  {:number_of_messages => 15}).each do |m|
  puts m.message_text
  azure_queue_service.delete_message("test-queue", m.id, m.pop_receipt)
end

如何:获取队列长度

可以获取队列中消息数的估计值。 该方法 get_queue_metadata() 返回近似消息计数和其他队列元数据。

message_count, metadata = azure_queue_service.get_queue_metadata(
  "test-queue")

如何:删除队列

若要删除队列及其包含的所有消息,请对队列对象调用 delete_queue() 方法。

azure_queue_service.delete_queue("test-queue")

后续步骤

了解队列存储的基础知识后,请按照以下链接了解更复杂的存储任务。

有关本文中讨论的 Azure 队列存储与 如何使用服务总线队列中讨论的 Azure 服务总线队列之间的比较,请参阅 Azure 队列存储和服务总线队列 - 比较和对比