现在的位置: 首页 > 综合 > 正文

AWS SQS DOC AND RUBY DEMO

2018年09月07日 ⁄ 综合 ⁄ 共 2938字 ⁄ 字号 评论关闭

# Amazon SQS

搜集整理aws sqs 的文档以及使用Ruby demo

## Amazon Simple Queue Service (SQS) 

是一个可伸缩且可靠的消息传递框架,可以使用它简便地创建、存储和获取文本消息。可以使用它构建基于 Amazon Web Services 的应用程序。使用 SQS 是构建松散耦合的 Web 应用程序的好方法。只需根据使用量为消息付费。整个队列框架在 Amazon 数据中心的安全环境中运行。

## 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 使用基于加权随机分布的消息取样,在查询消息时,它只从取样的一部分服务器返回消息。尽管一次查询请求可能不会返回队列中的所有消息,但是如果一直从队列中获取消息,最终会取样所有服务器,您就会得到所有消息。

## API 版本

尽快开始迁移使用老 API 版本的应用程序。
为了尽可能减少麻烦,在用 SQS 创建新应用程序时,应该使用 API 的最新版本。

## Amazon Web Services 和 SQS 入门

要想开始使用 SQS,首先需要注册一个 Amazon Web Services 账户(见 参考资料)。本系列的 第 2 部分 详细介绍了如何注册 Amazon Web Services 账户。

创建账户之后,必须为账户启用 Amazon SQS 服务:

* 注册 Amazon Web Services 账户。
* 导航到 SQS 主页。
* 单击页面右边的 Sign Up For Amazon SQS。
* 提供必需的信息并完成注册过程。

## 与 SQS 交互  AWS SQS RUBY Example

(http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SQS.html#queues-instance_method)

* Ruby AWS-SDK GEM

https://github.com/aws/aws-sdk-ruby

* 设置一些环境变量,引用 Amazon Web Services 访问键。
可以从 Web Services Account information 页面获得访问键。(http://aws-portal.amazon.com/gp/aws/developer/account/index.html?ie=UTF8&action=account-links)

config.yml

access_key_id: xxx
secret_access_key: yyy

* 获取消息

sqs_poll.rb

#!/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

* 发送消息

sqs_send.rb

#!/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

抱歉!评论已关闭.