整个队列框架在 Amazon 数据中心的安全环境中执行。html
* 可伸缩性
可以用 SQS 建立基于队列的应用程序。这些程序可以读写数量不限的消息。
* 低成本
SQS 以很低廉的费率知足您的消息传递需求。
git
* 仅仅有当超时周期过时时,而且读取消息的应用程序没有删除它,消息才会又一次出现在队列中。
* 消息在队列中保留四天。github
* SQS 会本身主动删除在队列中超过四天的消息。web
SQS 採用 “终于一致性(eventual consistency)” 模型。这意味着您能够向队列发送消息,但是队列的消费者不必定能够在特定的时间段内看到它。消息终于会投递,但是必定要考虑您的应用程序是否在乎消息的次序。编程
* 表 1. 消息的组成部分
部分 说明
MessageId 引用此消息的唯一 ID。安全
ReceiptHandle 在从队列获取消息时返回的唯一句柄。每次从队列获取消息时返回的句柄都不同。在删除消息时需要使用它。
MD5OfBody 非 URL 编码的消息体字符串的 MD5 摘要。
Body 实际的消息数据。ruby
* 队列
队列 是消息的容器。每个消息必须指定将容纳它的队列。发送给队列的消息保留在队列中。直到显式地删除它们。队列採用 “先进先出” 次序,但是并不保证次序。每个队列的默承认见性超时值是 30 秒。可以为整个队列改动这个值,也可以在获取消息时单独为每个消息设置。框架
队列或消息可见性超时值的最大值是两小时(7,200 秒)。假设队列中连续 30 天没有活动,SQS 保留本身主动删除它们的权力。编程语言
在设计应用程序时,必须保证屡次处理同一消息不会对程序产生影响。SQS 把每个消息存储在多台server上。从而提供冗余和高可用性。假设在删除一个消息时当中一个server不可用,那么在之后接收消息时有可能再次获取此消息的拷贝(虽然这样的状况很是少出现)。ui
* SQS 不保证在查询时返回队列中的所有消息。
SQS 使用基于加权随机分布的消息取样,在查询消息时。它仅仅从取样的一部分server返回消息。虽然一次查询请求可能不会返回队列中的所有消息,但是假设一直从队列中获取消息,终于会取样所有server。您就会获得所有消息。
本系列的 第 2 部分 具体介绍了怎样注冊 Amazon Web Services 帐户。
建立帐户以后,必须为帐户启用 Amazon SQS 服务:
* 注冊 Amazon Web Services 帐户。
* 导航到 SQS 主页。
* 单击页面右边的 Sign Up For Amazon SQS。
* 提供必需的信息并完毕注冊过程。
ie=UTF8&action=account-links)
config.yml
access_key_id: xxx secret_access_key: yyy
#!/usr/bin/env ruby require 'yaml' require 'aws-sdk' config_file = File.join(File.dirname(__FILE__),"config.yml") config = YAML.load(File.read(config_file)) AWS.config(config) sqs = AWS::SQS.new queue = sqs.queues.create("my_queue") queue.poll do |msg| puts msg.body end
#!/usr/bin/env ruby require 'yaml' require 'aws-sdk' config_file = File.join(File.dirname(__FILE__),"config.yml") config = YAML.load(File.read(config_file)) AWS.config(config) # http://rubydoc.info/github/amazonwebservices/aws-sdk-for-ruby/master/AWS/SQS sqs = AWS::SQS.new queue = sqs.queues.create("my_queue") # http://rubydoc.info/github/amazonwebservices/aws-sdk-for-ruby/master/AWS/SQS/Queue send = lambda { |name, queue| while true do queue.send_message("#{name}:#{Time.now.to_s}") sleep 1 end } Thread.new { send.call("t1", queue) } Thread.new { send.call("t2", queue) } Thread.new { send.call("t3", queue) } sleep 1000