ActiveRecord 経由でメッセージを永続化

追記: 設定ファイルの書き方をより直感的なものに変更しました 2007/10/4 14:08


メッセージの格納先としては、これまで次のものがありました。

  • reliable-msg がデフォルトで提供している MySQL と disk (ファイル)
  • AP4R で追加で提供している PostgreSQL


現在開発中のバージョンでは、これらに加えて ActiveRecord 経由での格納ができるようにしています。
これにより、対応 DB が一気に増えて「AR で対応」=「AP4R で対応」になりました♪
#ただし、カリカリにチューニングされた高い性能が要求される場合には、向かないでしょう。


実際に動かしてみます。
すでに別バージョンの AP4R がインストールされていても、以下の方法で試せます。
#というか、reliable-msg をはじめとする関連ライブラリは別途インストールされている必要がありますので、AP4R がインストールされていたほうが面倒が少ないです。 (^^;
#以下では、関連ライブラリがそろっている前提で話を進めます。

% svn co http://ap4r.rubyforge.org/svn/trunk/ap4r/
(or % svn co svn://rubyforge.org/var/svn/ap4r/trunk/ap4r)
% cd ap4r
% mkdir log    # ap4r_setup した場合は不要だが、今は自分で作成
% mkdir public # 同上
% ruby -I lib script/mongrel_ap4r start -A config/queues_disk.cfg


最新の AP4R にパスを指定して disk モードで問題なく起動できることを確認しておきます。



さて、ここからいよいよ ActiveRecord モードを使ってみます。


まず、設定ファイルを用意します。
ActiveRecord モードを利用する場合には、type の項目に "activerecord" を指定し、adapter の項目に DB の種類を指定してください。今回は (これまで対応していなかった) SQLite を使ってみます。SQLite は別途インストール済みの状態にしておきます。


SQLite の場合は、database の項目にファイルパスを指定します (Rails と同じです)。
DB ファイルを AP4R のホームディレクトリ以外におくのであれば、絶対パスで指定してください。
私の環境では、以下の設定内容にしてみました。これだと、ホームディレクトリ直下にファイルが作成されます。

% vi config/queues_ar.cfg
---
store:
  type: activerecord
  adapter: sqlite3
  host: localhost
  database: reliable_msg.db
  username: ap4r
  password: ap4r
drb:
  host:
  port: 6438
  acl: allow 127.0.0.1 allow ::1 allow 10.0.0.0/8
dispatchers:
  -
    targets: queue.*
    threads: 1


次に、メッセージを格納するテーブルを作成します。
以下の Rake タスクで先の設定ファイルで指定された DB にテーブルができます。
#db じゃなくて、qdb なのに注意...

% rake qdb:migrate


DB ファイルが作成されています。

% ls -l | grep re
-rw-r--r--    1 kiwamu  kiwamu  4096 Oct  3 20:00 reliable_msg.db


で、起動します。

% ruby -I lib script/mongrel_ap4r start -A config/queues_ar.cfg


無事に動いたでしょうか?

irb からメッセージの put/get をしてみましょう。

% irb -rubygems -rap4r
irb(main):001:0> q = ReliableMsg::Queue.new "test.queue"
=> #<ReliableMsg::Queue:0x1419014 @queue="test.queue">
irb(main):002:0> q.put "hoge"
=> "b57891a0-53cd-012a-cfed-0016cb9ad524"
irb(main):003:0> q.get
=> #<ReliableMsg::Message:0x140d87c @id="b57891a0-53cd-012a-cfed-0016cb9ad524", @headers={:priority=>0, :created=>1191409199, :expires=>nil, :delivery=>:best_effort, :id=>"b57891a0-53cd-012a-cfed-0016cb9ad524", :max_deliveries=>5}, @object="hoge">


最後に蛇足ですが、
ActiveRecord 経由で MySQLPostgreSQL に接続する場合は、同様に type の項目を "activerecord" とし、adapter の項目に "mysql" や "postgresql" を指定します。


少し、使える幅が広がったかな?