メモリキュー
実装しました。
trunk からとってくると、試せます。
メッセージをデータベースやファイルに永続化せず、メモリ上に保持するだけなので速いです。
ただし、プロセスがこけたり、正常終了すれば揮発します。なので、ちょっと軽く試したいとき向きでしょう。
disk モードでもいいんですが、こいつだとオープンできるファイル数に制限があるので、あんまりたくさんメッセージを投げると、「Too many open files - ...」が発生しまうので用意してみました。
trunk から取得。
% svn co http://ap4r.rubyforge.org/svn/trunk/ap4r/ ap4r (or % svn co svn://rubyforge.org/var/svn/ap4r/trunk/ap4r ap4r) % cd ap4r % mkdir log # ap4r_setup した場合は不要だが、今は自分で作成 % mkdir public # 同上
設定ファイルを作成。
queues_disk.cfg の type の項目を memory に変えるだけでも可。
% vi config/queues_memory.cfg --- store: type: memory drb: host: port: 6438 acl: allow 127.0.0.1 allow ::1 allow 10.0.0.0/8 dispatchers: - targets: queue.* threads: 1
起動。
% ruby -I lib script/mongrel_ap4r start -A config/queues_memory.cfg ** Starting AP4R Handler with config/queues_disk.cfg Loaded queues configuration from: /Users/kiwamu/work/svn/ap4r/trunk/ap4r/config/queues_memory.cfg Using message store: memory Accepting requests at: druby://:6438 about to start dispatchers with config --- - threads: 1 targets: queue.* start dispatcher: targets= #<ReliableMsg::MultiQueue:0x31f78d8>, index= 0) dispatch targets are : queue.*; queue manager has forked dispatchers ** Signals ready. TERM => stop. USR2 => restart. INT => stop (no restart). ** Mongrel available at 0.0.0.0:7438 ** Use CTRL-C to stop. ** Mongrel start up process completed.
irb からメッセージの put/get を実行し、ベンチマーク。
環境は開発機の iMac でこんなんでした。
% irb -rubygems -rap4r >> q = ReliableMsg::Queue.new "test" >> Benchmark.bm do |b| ?> 10.times do ?> b.report do ?> 1000.times do ?> q.put "hoge" >> q.get >> end >> end >> end >> end user system total real 0.350000 0.060000 0.410000 ( 1.627003) 0.400000 0.060000 0.460000 ( 1.546941) 0.360000 0.050000 0.410000 ( 1.602893) 0.400000 0.060000 0.460000 ( 1.541918) 0.360000 0.060000 0.420000 ( 1.559262) 0.390000 0.050000 0.440000 ( 1.541137) 0.360000 0.060000 0.420000 ( 1.592289) 0.400000 0.060000 0.460000 ( 1.585100) 0.350000 0.050000 0.400000 ( 1.551247) 0.410000 0.060000 0.470000 ( 1.679758) => true
put/get × 1000 回実行を 10 回繰り返しています。
put と get、計 2000 処理を平均 1.5 秒程度なので、TPS としては 1300 ほどでました。
1 スレッドからしかかけていないので、リソースは全然使いきれてませんが、そこそこ速いですね。