AP4R on Rails はじめの一歩
概要
まじろうが大ブレイクしたAP4R。かつてプレスリリースを見たときにはいわゆるエンタープライズ向けのライブラリなんだろうなぁと思い、趣味プログラマには大袈裟そう、という印象を持ちました。しかし、RubyKaigi2007でid:kiwamuさんとid:ita-wasaさんのプレゼンテーションを見て、その思い込みがどうも間違っていたらしいことを認識しました。「メッセージングライブラリ」と聞くと難しそうですが、AP4Rを使うと非同期処理が手軽に書けるようになります。
以下に数時間弄ってみて理解した範囲でまとめておきます。debian etch上で試しました。
AP4Rインストール
まずAP4Rをインストールします。
% sudo gem install ap4r
Railsアプリケーションの用意
練習用のRailsアプリケーションtestappを作成します。
% rails install testapp
AP4Rをrailsアプリケーションに入れます。
% ap4r_setup testapp
AP4RのRails用プラグインを導入します。
% cd testapp % ./script/plugin install svn://rubyforge.org/var/svn/ap4r/tags/ap4r-0.3.2/samples/HelloWorld/vendor/plugins/ap4r
実装
コントローラを実装します。webブラウザから呼ばれて即応するstoreアクションと、storeアクションから呼ばれて時間のかかる処理を実行するstore_asyncアクションを作ります。
% ./script/generate controller top index store % vim app/controllers/top_controller.rb
topコントローラは以下のようにしてみました。
class TopController < ApplicationControllerdef index end
def store id = rand(100) ap4r.async_to({:action=>’store_async’}, {:id=>id}) render :text=>”my id = #{id}” end
def store_async sleep 10 open(File.join(RAILS_ROOT,”test.txt”), ”a”) do |f| f.puts [params[:id],Time.now.to_s].join(”,”) end render :text=>”true” end end
起動
AP4Rを起動します。
% ruby script/mongrel_ap4r start -A config/queues_disk.cfg
Railsアプリケーションを起動します。
% ruby script/server
試してみる
ブラウザで http://example.jp/top/store を開くと、RAILS_ROOTにtest.txtができます。tail -f test.txtしながら実行してみましょう。ページをリロードするとすぐに反応し、「my id = (乱数)」と表示されます。しばらくすると(sleep 10しています)、test.txtにidと時刻が追記されるはずです。
今後の課題
今後の(私の)課題としては、
- (オモチャではなく)実用的なアプリケーションを実装する
- 負荷をかけた状態で使ってみる
- サーバが複数ある構成で使ってみる
などが挙げられます。
参考
- AP4R project’s homepage
- 日本 Ruby 会議 2007 - Log0610-S1-04
- RubyKaigi2007 の発表資料を公開しました - kiwamu日記
- AP4R's presentation at RubyKaigi2007 - いたわさににほんしゅ
- no title
6/15 18:31 の更新に関する補足(該当部分は既に修正済みです)
AP4R on Rails はじめの一歩 - kiwamu日記 によりますと、
開発時には samples/HelloWorld 以下のプラグインをさわっているので、上記の部分は変更していません。そもそも存在するのがまぎらわしいので消しておきました。 (^^;
とのことでしたので、以下の記述
ap4rのディストリビューションに付属しているプラグイン svn://rubyforge.org/var/svn/ap4r/trunk/ap4r/rails_plugin/ap4r では、RubyKaigi2007でデモしていた ap4r.async_to が使用できないようでした。
を削除しました。
また、
id:darashi さんの探し出してくれた trunk 以下のものだと開発中のため API が変わっている可能性もあります。こちらのほうが確実でしょう。
#x.y.z は AP4R のバージョンに読み替えてください。現在は、0.3.2 です。
とのコメントをいただきましたので、
% ./script/plugin install svn://rubyforge.org/var/svn/ap4r/trunk/samples/HelloWorld/vendor/plugins/ap4r
から
% ./script/plugin install svn://rubyforge.org/var/svn/ap4r/tags/ap4r-0.3.2/samples/HelloWorld/vendor/plugins/ap4r
に変更しました。