分かったこと
-
キューに入ったデータを取得する方式は、ショートポーリングとロングポーリングの方式があって推奨されてるのはロングポーリング
http://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/general-recommendations.htmlロングポーリングは、ほとんどの場合にショートポーリングよりも推奨されます。
標準キューの場合、順不同なため最後に追加されたキューが最後に取得できるとは限らない
Rubyから使う場合
- ネットで検索した時に出てくるサンプルコードはAWS SDK for Rubyのv1で書かれたものが出てくる場合があるので注意
- 実装例
キューに追加
sqs = Aws::SQS::Client.new
sqs.send_message(
queue_url: "https://sqs.ap-northeast-1.amazonaws.com/123445/queue_name",
message_body: {
id: 1,
title: 'title',
created_at: Time.current
}.to_json
)
キューから取得
poller = Aws::SQS::QueuePoller.new("https://sqs.ap-northeast-1.amazonaws.com/123445/queue_name")
poller.poll(max_number_of_messages: 10, idle_timeout: 60) do |msg|
result = JSON.parse(msg.body)
end
Elixirから使う場合
- Elixir用のAWS SDKがないためex_awsを使うことになる
- ex_awsを使う場合、AWSのAPIがSQSのレスポンスはXMLで返ってくるようでsweet_xmlも追加しないとエラーになった
- 使い方のコードのサンプルがあまりないので、テストコードを見ると参考になった
追加したパッケージ
{:ex_aws, "~> 1.0"},
{:poison, "~> 2.0"},
{:hackney, "~> 1.6"},
{:sweet_xml, "~> 0.6.5"}
キューに追加
body = %{"id" => 1, "title" => "title", "created_at" => DateTime.utc_now() } |> Poison.encode!
ExAws.SQS.send_message("/123445/queue_name", body) |> ExAws.request!(region: "ap-northeast-1")