Q4MのConditional Subscriptionを使う前にベンチマークを取ってみました。
マシン
Model Name: MacBook Pro Model Identifier: MacBookPro13,2 Processor Name: Intel Core i5 Processor Speed: 2.9 GHz Number of Processors: 1 Total Number of Cores: 2 L2 Cache (per Core): 256 KB L3 Cache: 4 MB Memory: 16 GB
テーブルスキーマ
CREATE TABLE `q4m_test` ( `id` varchar(255) COLLATE utf8mb4_bin NOT NULL, `payload` text COLLATE utf8mb4_bin NOT NULL, `enqueued_at` int(10) unsigned NOT NULL ) ENGINE=QUEUE;
enqueued_atをConditional Subscriptionで使います。
enqueued_atにはキューを入れた時間を入れています。
Conditional Subscriptionにはintegral values(整数値)なので、unixtimestamp形式で保存しています。
ベンチの条件
予め6000件のデータを作成しました。 payloadには1000バイトの文字列を入れています。
【1】6000件のデータのうち、最後の1000件のキューを取り出して処理するパフォーマンス
こんなスクリプトで計測しました。
require 'mysql2'
require 'benchmark'
client = Mysql2::Client.new(host: "localhost", username: "root", database: 'test')
1000.times do
result = Benchmark.realtime do
result = client.query("SELECT queue_wait('q4m_test:enqueued_at>=1501686146', 5)")
client.query('select queue_end()')
end
puts "#{result}"
end
結果

縦軸が秒になります。 横軸が時間軸になります。
特に劣化する様子はありません。
【2】5000件のデータを処理するパフォーマンス
上で5000件になったデータを全て順に処理していくようにして処理速度を計測してみました。
require 'mysql2'
require 'benchmark'
client = Mysql2::Client.new(host: "localhost", username: "root", database: 'test')
1000.times do
result = Benchmark.realtime do
result = client.query("SELECT queue_wait('q4m_test:enqueued_at<1501686146', 5)")
client.query('select queue_end()')
end
puts "#{result}"
end
結果

縦軸が秒になります。 横軸が時間軸になります。
1とくらべてもそこまで大きな変化はありませんでした。
キューを入れる処理
キューを入れるときも処理速度を計測してみました。
require 'mysql2'
require 'benchmark'
require 'securerandom'
client = Mysql2::Client.new(host: "localhost", username: "root", database: 'test')
payload = 'a' * 1000
stmt = client.prepare('INSERT INTO q4m_test VALUES (?, ?, ?)')
4000.times do
result = Benchmark.realtime do
stmt.execute(SecureRandom.uuid, payload, Time.now.to_i + 1000)
end
puts "#{result}"
end
結果

○でくくったパフォーマンスが劣化した部分はおそらく、compactionが走った影響かと思われます。