Edited at

RubyでAWSのSQSを使う

More than 5 years have passed since last update.

Amazon SQS(Amazon Simple Queue Service)はAmazonが提供するキューサービスです。


Amazon Simple Queue Service(SQS)は、高速で、信頼性が高く、スケーラビリティに優れ、十分に管理されたキューサービスです。SQS を利用すると、簡単かつコスト効率良く、クラウドアプリケーションのコンポーネントを切り離すことができます。SQS を使用すれば、どんなボリュームのデータでもあらゆるレベルのスループットで転送できます。転送時にメッセージが失われることも、他のサービスが常に利用可能である必要もありません。

(公式HP)


今回はAサーバで受け取ったデータを非同期にBサーバで処理するといった要件が発生したので簡単な使い方を書いておきます。

他にも一気にきたリクエストをとりあえずSQSに登録しておいて、あとからゆっくり処理させるといった使い方もできます。


Queueの作成

AWS管理コンソール上で作成します。

[Create New Queue]ボタンを押すとダイアログが出るので

Queue Name : queueの名前(1-80文字。英数字と-と_が使える)

Default Visibility Timeout : 一度取得したメッセージを見えなくする時間

Message Retention Period : メッセージを保持する期間

Maximum Message Size : queueに登録できる1メッセージ当たりの最大量

Delivery Delay : 登録したメッセージが見えるようになるまでのDelay

Receive Message Wait time : ロングポーリング時のメッセージがくるまでの待ち時間

を設定します。


メッセージを登録


server_A

# AWSの初期化

AWS.config(
:access_key_id:<ACCESS_KEY_ID>,
:secret_access_key:<SECRET_ACCESS_KEY>
)
sqs = AWS::SQS.new

# もしくは
sqs = AWS::SQS.new(
:access_key_id:<ACCESS_KEY_ID>,
:secret_access_key:<SECRET_ACCESS_KEY>
)

# 対象のqueueのurlを取得(WEBのコンソール画面から)
queue_url = "https://sqs.ap-northeast-1.amazonaws.com/xxxxx/hogehoge"

# queueに登録するメッセージ
queue_msg = "test queue message"

# queueにメッセージを登録
sqs.queues[queue_url].send_message(queue_msg)


処理に成功していれば、AWS管理コンソールの対象のqueueのMessages Availableが増えています。


メッセージを取得


server_B

sqs = AWS::SQS.new

queue_url = "https://sqs.ap-northeast-1.amazonaws.com/xxxxx/hogehoge"

# ロングポーリングでメッセージを取得
sqs.queues[queue_url].poll(:idle_timeout => 10) do |msg|
# 取得したメッセージを表示
puts msg.body # => test queue message

# メッセージの内容で任意の処理
end


先ほど登録したメッセージが、表示されます。取得順は、メッセージを登録した順番が保証されるわけではないので注意してください。

:idle_timeoutはメッセージが来るまでの待機時間です。指定しないとずっと待ち続けてレスポンスが返ってきません。

他のサイトで、受け取ったメッセージは明示的に削除しないとqueueに残り続けると書かれていますが、上記のコードのようにQueue#poll及び、Queue#receive_messageでブロック形式を利用してる場合は、途中で例外が発生しない限り、受け取ったメッセージは自動的に削除されるようです。