整個隊列框架在 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