メモリキュー

実装しました。
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 スレッドからしかかけていないので、リソースは全然使いきれてませんが、そこそこ速いですね。