如何通过 Ruby 使用队列存储

Tip

尝试 Azure 存储资源管理器

Azure 存储资源管理器是 Microsoft 免费提供的独立应用,适用于在 Windows、macOS 和 Linux 上以可视方式处理 Azure 存储数据。

概述

本指南演示了如何使用 Microsoft Azure 队列存储服务执行常见方案。 相关示例是使用 Ruby Azure API 编写的。 介绍的方案包括插入扫视获取删除队列消息以及创建和删除队列

什么是队列存储?

Azure 队列存储是一项可存储大量消息的服务,用户可以通过经验证的呼叫,使用 HTTP 或 HTTPS 从世界任何地方访问这些消息。 一条队列消息的大小最多可为 64 KB,一个队列中可以包含数百万条消息,直至达到存储帐户的总容量限值。

队列存储的常见用途包括:

  • 创建积压工作以进行异步处理
  • 将消息从 Azure Web 角色传递到 Azure 辅助角色

队列服务概念

队列服务包含以下组件:

队列 1

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

    可使用以下 URL 访问示意图中的某个队列:

    http://myaccount.queue.core.chinacloudapi.cn/images-to-download

  • 存储帐户: 对 Azure 存储服务的所有访问都要通过存储帐户来完成。 有关存储帐户容量的详细信息,请参阅 Azure 存储可伸缩性和性能目标

  • 队列: 一个队列包含一组消息。 所有消息必须位于相应的队列中。 请注意,队列名称必须全部小写。 有关命名队列的详细信息,请参阅 命名队列和元数据
  • 消息: 一条消息(不管采用何种格式)的最大大小为 64 KB。 消息可以保留在队列中的最长时间为 7 天。

创建 Azure 存储帐户

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

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

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

创建 Ruby 应用程序

创建 Ruby 应用程序。 有关说明,请参阅使用 Linux 应用服务创建 Ruby 应用

配置应用程序以访问存储

要使用 Azure 存储,需下载和使用 Ruby Azure 包,其中包括与存储 REST 服务进行通信的一组方便的库。

使用 RubyGems 获取该程序包

  1. 使用命令行接口,例如 PowerShell (Windows)、Terminal (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 门户中的经典或 Resource Manager 存储帐户中获取这些值:

  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() 方法来更新消息。 该方法返回一个元组,其中包含队列消息的 POP 接收方,以及一个 UTC 日期时间值,表示队列中显示消息的时间。

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 队列和服务总线队列 - 比较与对照