Help us understand the problem. What is going on with this article?

AWS SQSのFIFOキューを試してみた

More than 1 year has passed since last update.

背景

2018年11月にAWSの東京リージョンで、SQS(Simple Queue Service)のFIFOキューを作成できることになったので、試しに使ってみた。
今までのキューはアプリ側でSQSの特徴をカバーして上げる必要があったからちょっと困ったちゃんだった。

FIFOキューとは?

標準キューとの大きな違いは

  • メッセージを first in first out で処理する
  • メッセージは1回だけ配信される(重複がない)

って感じですかね。
詳しくは公式さんで

使ってみた

SQSでキューを作成する

と言っても、ちょー簡単なので割愛します。(新幹線のチケット買うより簡単・・・)
基本はそのままで使えるのですが、標準キュート違う設定が必要なところだけ説明します。

キュー名の最後には.fifoが必要

queue_name.png

コンテンツに基づく重複排除のチェックボックスをONにする
ONにしておかないとメッセージ登録に失敗します。

duprication.png

aws-sdkを使ってメッセージ登録する

今回はrubyのaws-sdkを使用してメッセージ登録を行いました。
特に言語は気にしませんが、大量に登録したかっただけ。

send_message.rb
require 'aws-sdk'
sqs = Aws::SQS::Client.new(
    region: 'ap-northeast-1', # 東京リージョン
    access_key_id: 'access_key_id',
    secret_access_key: 'secret_access_key',
    )
url = 'url' # FIFOキューのURL(マネージメントコンソールで確認するやつ)
for num in 1..1000 do
  response = sqs.send_message({
    queue_url: url,
    message_body: 'standard queue message ' + num.to_s, # 登録した順番がわかるようにナンバリング
    message_attributes: { # message_attributesは特にこだわらない
      'Title' => {
       string_value: 'title',
       data_type: 'String'
      },
      'Author' => {
        string_value: 'author',
        data_type: 'String'
      },
      'WeeksOn' => {
        string_value: '6',
        data_type: 'Number'
      }
    },
    message_group_id: 'b-group', # 標準キュート違ってmessage_group_idが必須
  })
end

標準キューの場合との違いはmessage_group_idが必須だということです。
message_group_idに基づいて順序性を保ってくれるらしいですね。
複数のホストからメッセージを登録するときは、message_group_idを設定する必要がありそうです。

キューメッセージを取得する

1000件のメッセージを取得してみます。
これもaws-sdkで取得します。

receive_message.rb
require 'aws-sdk'
sqs = Aws::SQS::Client.new(
    region: 'ap-northeast-1', # 東京リージョン
    access_key_id: 'access_key_id',
    secret_access_key: 'secret_access_key',
    )
url = 'url' # FIFOキューのURL(マネージメントコンソールで確認するやつ)
loop do
  # メッセージ受信
  res = sqs.receive_message(queue_url: url,
      max_number_of_messages: 1,
      visibility_timeout: 60,
      wait_time_seconds: 1)
  # 0件だったらループから抜ける
  break if !res || !res.respond_to?(:messages) || res.messages.count.zero?
  # メッセージ出力
  puts res.messages[0].body 
  # メッセージ削除
  handle = res.messages[0].receipt_handle
  delete_res = sqs.delete_message({
    queue_url: url,
    receipt_handle: handle,
  })
end

こちらは標準キューとやることは変わりませんね。
message_group_idを指定する方法とかあるのかな?ないのかな?

ということで、結果はこちら

standard queue message 1
standard queue message 2
standard queue message 3
・
・
・
standard queue message 998
standard queue message 999
standard queue message 1000

このように登録した順番で取得できることがわかります。

※標準キューの場合は順序性が保たれないことからこんな感じです。

standard queue message 6
standard queue message 5
standard queue message 9
・
・
・
standard queue message 998
standard queue message 995
standard queue message 999

 感想

今までは標準キューのみだったから、順序性が保たれないという点をアプリ側の機能でカバーしていた。(順序性が大事なデータや計算があったから。だいたい重要だよねって話もあるよねw)
FIFOキューが東京リージョンにきて素直に嬉しいと思ったし、標準キューと同じように使えるのはすごい良かった!
あとはFIFOキューに移行するってした時の影響範囲調査か・・・(つらたん)

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away