プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Amazon Simple Queue Service(SQS)の使い方

 AWSのサービスはどれも良く考えられていて好きですが、そんな中で使えば使える程に良さが解ってくるサービスとしてAmazon Simple Queue Service(SQS)があります。その名の通り、シンプルなキューサービスです。その分、可用性が高く、上手く使いこなせば様々なサービスの可用性を低コストで上げることが出来ると思います。
 一例で言えば従来型のシステムでは、可用性を上げる肝はデータベースにあったかと思います。もう少し言うと、参照系ではなく更新系の部分。もっとはっきり言うと、お金掛けてOracleRAC使えば一定の可用性は確保できるよねぇってアーキテクチャが多かったと思います。この更新系の部分をキューを使うことにより、コストを下げることと可用性を高めることに可能なのではないでしょうか?キュー+MySQL+レプリケーションみたいな構造です。もちろん書き込みの順番等、アプリ側で考慮する所が多く簡単には行きません。ただ実現出来れば、可用性の他にもピーク時の処理の緩和など色々な効果があります。ということで、まずは基本的な使い方を覚えておきます。

基本的な使い方



 Amazon SQSは次のような流れで利用します。

送信側
 1.名前指定で、キューの作成(CreateQueue)
 2.メッセージ(キュー)送信(SendMessage)
受信側
 1.名前指定で、キューの作成(CreateQueue)
 2.メッセージの受信(ReceiveMessage)
 3.(必要に応じて)メッセージのロック(ChangeMessageVisibility)
 4.メッセージ内容に応じて、特定の処理
 5.メッセージの削除(DeleteMessage)

キューの作成等はコンソール画面からでも出来るので、お試しの際はそれを使うのが良いでしょう。

料金とロングポーリング機能



Amazon SQSは、リクエストに応じて課金されます。2013年2月時点で、10,000リクエストにつき$0.01です。(1リクエストに付き0.000001 USD)つまり、1万回呼んで1円くらい。安い!!と思いますが、使い方によっては意外にお金が掛かります。例えば、1秒間に1回Pullリクエストを出し続けると、1ヶ月で60*60*24*30回で259円になります。まぁこれでも安いですが、複数のサーバで実行し続けていれば、それなりの金額になります。
 そんな時に出てきたのが、ロングポーリング機能です。これは、1回のリクエストでメッセージが利用になるまで1〜20秒待機する機能です。リクエスト側のCPUにも、お財布にも優しい機能ですね。

ロングポーリング機能は、Receive Message Wait timeの設定で、最大で20秒まで指定できます。前述の例で20秒でセットすると、60*60*24*30/20で13円くらいになりますね。はい、1/20のコストカットです。素晴らしい!!

rubyのサンプルコード



 SQSの動きを確認する為の、サンプルコードです。使用の際は、コンソール画面でQueueTestというキューを作ってください。その後、サンプルプログラムを実行して、コンソールのQueue ActionsからSend a Messageでメッセージを送れば、即座にメッセージが出てくると思います。また、Receive Message Wait timeの設定時間だけ待機している様も確認出来ると思います。

require 'rubygems'
require 'aws-sdk'

AWS.config(:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'],
:sss_endpoint => 'sqs.ap-northeast-1.amazonaws.com')

url = 'https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxx/QueueTest'

sqs = AWS::SQS.new

while true
receive = sqs.queues[url].receive_message()
if receive
message = receive.body
puts message
receive.delete
sleep 1
end
puts "Waiting"
sleep 1
end