Hatena::Groupstudyroom

文::字

2014-07-09

Amazon SQS、VisibilityTimeout の挙動 10:20  Amazon SQS、VisibilityTimeout の挙動 - 文::字 を含むブックマーク

14 日間の片想い、古いメッセージほど頻繁に受信されるようになってしまってダメな感じなんだけど、分散システムで言ったら一度受信されたけど処理しきれずキューの中で復活したメッセージほど受信されやすいということだから、メッセージキューシステムの仕様としてダメのような気がしている。メッセージが復活する際に、元のキューイングされた順番の中に復活するからこうなってしまうと思うので、復活するときにもう一度キューの末尾に push してやったほうがいいのか? Amazon SQS がどうなっているかを知りたいけど、そもそも Amazon SQS はメッセージの順番を厳密に保証していないから、調べづらい。VisibilityTimeout みたいな仕組みは Amazon SQS のオリジナルなのか、それとも標準的なメッセージキューの概念なのか、から調べる必要がありそう。

メモ:

require 'aws-sdk'
require 'rspec'

describe 'VisibilityTimeout' do
        it '' do
                sqs = AWS::SQS.new
                q = sqs.queues.create('VisibilityTimeoutTest')
                10.times do |i|
                        puts "sending 'hello #{i}'"
                        q.send_message("hello #{i}")
                end

                message = q.receive_message(:visibility_timeout => 1)
                puts "received #{message.body} with visibility_timeout = 1"
                puts "sleeping 2 seconds"
                sleep 2

                messages = q.receive_message(:limit => 10)
                messages.each do |message|
                        puts message.body
                end
                #puts "received '#{message.body}'"

                #3.times do |i|
                #       message = q.receive_message
                #       puts "received '#{message.body}'"
                #end
        end
end