AWS SQS DOC AND RUBY DEMO


# 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





















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章