5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

背景

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キューに移行するってした時の影響範囲調査か・・・(つらたん)

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?