URL rewrite フィルタ

Rails から Ap4r::Client#async_to メソッドを使うと、引数に渡したデータが指定した宛先(コントローラ/アクション)に運ばれ、非同期でアクションが実行されます。
これまでのデフォルトだと、非同期の処理はメッセージの投げ元の Rails 上で実行されていましたが、これが任意のパスを指定できるようになります。
#厳密には、オプションの :target_url を指定すると任意のサーバ上でも実行できました。


つまり、複数の Rails サーバをたてておいて、同期と非同期の処理を別々のサーバで実行するなんてことが簡単にできます。


設定はいたって簡単で、以下のように URL の書き換えロジックを設定ファイルに Procオブジェクトで書いときます。文字列です。
Procオブジェクトを渡すので、書き換えロジックは思いのままです。


下の例だと、非同期用のメッセージを 4001番ポートから 4003番ポートまでの3つのサーバにランダムに振り分けます。
非同期の処理が完了するまではスレッドが占有されるので、threads の値も増やしておきます。ここを変えないと、せっかく宛先が 3つもあるのに、複数のメッセージを並列に処理することができません。

  • $AP4R_HOME/config/queue_disk.cfg
...
  acl: allow 127.0.0.1 allow ::1 allow 10.0.0.0/8
dispatchers:
  -
    targets: queue.*
    threads: 5
    modify_rules:
      url: "Proc.new {|url| url.port = 4001 + rand(3); url}"      
#carriers:
...


mongrel_cluster あたりでさくっと複数サーバを起動し、HelloWorld サンプルを実行してみるとなかなか爽快な並列処理っぷりが見れます♪