Amazon Simple Queue Service (SQS) 是一个可伸缩且可靠的消息传递框架,可以使用它简便地创建、存储和获取文本消息。可以使用它构建基于 Amazon Web Services 的应用程序。使用 SQS 是构建松散耦合的 Web 应用程序的好方法。只需根据使用量为消息付费。整个队列框架在 Amazon 数据中心的安全环境中运行。
SQS 提供以下特性:
-
可靠性
- SQS 能够跨多个数据中心冗余地存储消息,保证它们随时可用。 简单性
- 访问和使用 SQS 的编程模型非常简单,而且可以通过多种编程语言使用 SQS。 安全性
- SQS 提供很高的安全水平。只允许授权的用户访问消息。 可伸缩性
- 可以用 SQS 创建基于队列的应用程序,这些程序可以读写数量不限的消息。 低成本
- SQS 以非常低廉的费率满足您的消息传递需求。
下面讨论支撑 SQS 框架的概念。
消息 包含不超过 8 KB 的文本数据。每个消息一直存储到被应用程序接收为止。当接收消息的应用程序从队列中读取一个消息时,指定可见性超时值(以秒为单位)。它的作用就像是锁:
- 确保在指定的时间段内队列的其他消费者看不到已被接收的消息。
- 只有当超时周期过期时,而且读取消息的应用程序没有删除它,消息才会重新出现在队列中。
消息在队列中保留四天。
SQS 会自动删除在队列中超过四天的消息。SQS 采用 “最终一致性(eventual consistency)” 模型,这意味着您可以向队列发送消息,但是队列的消费者不一定能够在特定的时间段内看到它。消息最终会投递,但是一定要考虑您的应用程序是否在意消息的次 序。
消息由表 1 所示的几个部分组成。
部分 | 说明 |
---|---|
MessageId | 引 用此消息的惟一 ID。 |
ReceiptHandle | 在 从队列获取消息时返回的惟一句柄。每次从队列获取消息时返回的句柄都不一样。在删除消息时需要使用它。 |
MD5OfBody | 非 URL 编码的消息体字符串的 MD5 摘要。 |
Body | 实际的消息数据。 |
队列 是消息的容器。每个消息必须指定将容纳它的队列。发送给队列的消息保留在队列中,直到显式地删除它们。队列采用 “先进先出” 次序,但是并不保证次序。每个队列的默认可见性超时值是 30 秒。可以为整个队列修改这个值,也可以在获取消息时单独为每个消息设置。队列或消息可见性超时值的最大值是两小时(7,200 秒)。如果队列中连续 30 天没有活动,SQS 保留自动删除它们的权力。
SQS 与常见的队列框架有点儿不一样。在设计基于 SQS 的应用程序之前,您必须考虑三个问题:
- SQS 不保证队列中消息的次序。
消息在队列中的次序是宽松的;它们实际上并不按照在队列中添加消息的次序存储。SQS 会尝试保持消息的次序,但是不保证接收消息的次序与发送它们的次序完全相同。如果消息的次序对于您的应用程序很重要,就需要在每个消息中添加序列数据。
- SQS 不保证删除队列中的消息。
在设计应用程序时,必须保证多次处理同一消息不会对程序产生影响。SQS 把每个消息存储在多台服务器上,从而提供冗余和高可用性。如果在删除一个消息时其中一个服务器不可用,那么在以后接收消息时有可能再次获取此消息的拷贝 (尽管这种情况很少出现)。
- SQS 不保证在查询时返回队列中的所有消息。
SQS 使用基于加权随机分布的消息取样,在查询消息时,它只从取样的一部分服务器返回消息。尽管一次查询请求可能不会返回队列中的所有消息,但是如果一直从队列 中获取消息,最终会取样所有服务器,您就会得到所有消息。
有两个 SQS 版本:最初版本 (2007-05-01) 和 2008-01-01 版本。API 的版本号通常采用发布日期。2007-05-01 API 将于 2009 年 5 月 6 日废止,在此之后只支持 API 的最新版本。强烈建议用户:
- 尽快开始迁移使用老 API 版本的应用程序。
- 为了尽可能减少麻烦,在用 SQS 创建新应用程序时,应该使用 API 的最新版本。
2008-01-01 版本更新了定价,这降低了大多数用户的 SQS 使用费用,还包含更多特性和改进。但是,它也引入了与老 API 不兼容的更改。用老版本构建的所有库和工具都需要修改。关于版本之间的差异的详细信息可以在 SQS 网站上找到(见 参 考资料 )。
要想开始使用 SQS,首先需要注册一个 Amazon Web Services 账户(见 参 考资料 )。本系列的 第 2 部分 详细介绍了如何注册 Amazon Web Services 账户。
创建账户之后,必须为账户启用 Amazon SQS 服务:
与任何 Amazon Web Services 的所有通信都要通过 SOAP 接口或查询/REST 接口。在本文中,使用一个第三方库的查询接口与 SQS 通信。
需要获得自己的访问键,可以通过在 Web Services Account information 页面上选择 View Access Key Identifiers 获得访问键。现在设置了 Amazon Web Services 并为账户启用了 SQS 服务。
这个示例使用第三方 Python 库 boto ,通过在 Python shell 中运行代码来熟悉如何使用 SQS。
下载 boto 的最新版本,撰写本文时的最新版本是 1.4c。把存档文件解压到您选择的目录中。进入此目录并运行 setup.py
把 boto 安装到本地 Python 环境中,见清单 1。
$ cd directory_where_you_unzipped_boto |
设置一些环境变量,引用 Amazon Web Services 访问键。可以从 Web Services Account information 页面获得访问键。
# Export variables with your AWS access keys |
启动 Python shell 并导入 boto 库,从而确认所有设置都是正确的,见清单 3。
$ python |
SQSConnection
类提供与 SQS 交互的主要接口。使用 boto 的中介是 Python 控制台。示例调用 SQSConnection
对象上的不同方法,然后查看 SQS 返回的响应,这有助于熟悉 API 和体验 SQS 概念。
第一步是使用前面导出到环境中的 Amazon Web Services 访问键,创建一个连接到 SQS 的连接对象。boto 库总是先检查是否设置了这些环境变量。如果设置了这些变量,boto 在创建连接时自动地使用它们。
>>> import boto |
然后,可以使用 sqs_conn
对象与 SQS 交互。可以通过指定队列名称和可选的可见性超时值创建队列。如果没有指定超时值,boto 将用 SQS 提供的默认值(30 秒)创建队列。
>>> q1 = sqs_conn.create_queue('devworks-sqs-1') |
获取所有队列的列表,这返回一个结果集对象,它实际上是一个 Python 列表,见清单 6。可以循环遍历这个列表并访问每个队列的所有相关信息。
>>> all_queues = sqs_conn.get_all_queues() |
在删除队列之前,必须删除队列中的所有消息。可以使用 boto 中的 clear()
方法删除队列中的所有消息。
>>> q2.clear() |
可以向队列发送大小不超过 8 KB 的文本消息。使用 boto Message
类创建新消息,见清单 8。
>>> from boto.sqs.message import Message |
获取队列中的消息会返回一个结果集对象,它是一个包含消息对象的 Python 列表。每个消息对象有相关联的惟一 ID 和收件句柄。在从队列中读取消息之后,队列的其他所有消费者就看不到这个消息,直到可见性超时周期过期为止。过期之后,消息再次出现在队列中,让其他消费 者有机会获取和处理它。但是,如果在可见性超时周期过期之前从队列中删除了消息,消息就永远消失了,不会再次出现在队列中。
>>> msgs = q1.get_messages() |
可以通过指定消息数量获取多个消息。boto 中的默认设置是返回一个消息。我们在队列中添加另一个消息,然后获取所有消息,见清单 10。请记住,新添加的消息出现在队列中可能要花费一分钟左右。
>>> m2 = Message() |
可以通过调用 delete_message()
从队列中删除消息。请记住,在删除队列之前,必须删除队列中的所有消息。
>>> msgs = q1.get_messages() |
本文介绍了 Amazon 的 SQS 服务。学习了一些基本概念和 boto(一个用于与 SQS 交互的开放源码 Python 库)提供的一些功能。强烈建议您通过 Amazon SQS 开发人员指南了解更多信息(见 参 考资料 )。
这个 “用 Amazon Web Services 进行云计算 ” 系列的 第 5 部分 讨论如何用 Amazon SimpleDB 在云中处理数据集。
学习
- 阅读本系列的其他部分:
- 第 1 部分 “简介:选择租用而不是 购买 ”
- 第 2 部分 “用 Amazon Simple Storage Service (S3) 在云中存储数据 ”
- 第 3 部分 “用 EC2 根据需要提供服务器 ”
- 第 5 部分 “用 SimpleDB 在云中处理数据集 ”
- 了解各??? Amazon Web Services 的相关信息:
- Amazon Simple Storage Service (S3)
- Amazon Elastic Compute Cloud (EC2)
- Amazon Simple Queue Service (SQS)
- Amazon SimpleDB (SDB)
- Service Health Dashboard 由 Amazon 团队负责更新,提供每个服务的当前状态。
- 博客 及时提供 Amazon Web Services 的最新动态。
- 注 册 一个 Amazon Web Services 账户。
- Amazon Web Services Developer Connection 提供开发人员需要的所有参考资料。
- Amazon SQS 开发人员指南 提供 SQS 的各个组件的相关信息,以及高级使用方法和配置。
- Migrating to Amazon SQS API Version 2008-01-01 (Amazon 文章和教程)介绍 2008-01-01 版本中的变化。
- 使用 Simple Monthly Calculator 工具计算 SQS 和其他 Amazon Web Services 的每月使用费用。
- 阅读 Werner Vogel 的 博 客 上对最终一致性原理的讨论。
- 在 developerWorks 上的体系结构专区 寻找提高体系结构方面的技能所需的参考资料。
- 在 技术 书店 浏览关于这些主题和其他技术主题的图书。
获得产品和技术
下载 IBM 产品评估版 ,试用这些来自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。