@nqounetです。
Perl
で、Redis
を使ったメッセージキューシステムのResque
というモジュールを使ってみたのでメモしておきます。
前置き
沢山のリクエストを処理するようなウェブアプリでは、少し時間のかかる処理をジョブキューやメッセージキューというようなキューシステムを使って処理することが多くなるでしょう。
個人的にはQudo
が好きでよく使っているのですが、NoSQL
を使ったものはないのだろうかと探してみたら、Resque
というモジュールを見つけたので使ってみました。
ファイル群
キューシステムは、シンプルにしてもファイル数が多くなるので、慣れないうちは理解するのが大変だと思いますが、コレも慣れです。
|
|
それぞれの役目
cpanfile
cpanfile
には、モジュールの依存情報、平たく言うと使っているモジュールを書いておきます。
このファイルを作っておくと、モジュールのインストールが簡単です。
carton
を使わない場合でも、cpanm --installdeps .
のようにすると、依存モジュールをインストールしてくれます。
|
|
client.pl
client.pl
は、キューを作成する、平たく言うと仕事を取ってくる役目を担います。
会社で言うと、営業の方ですかね。仕事を取ってきて、キューに入れるところまでが役目です。
書いていてちょっと気になったのは、args
が配列のリファレンスしか受け付けないことです。
こういう時は、なんとなくハッシュリファレンスを渡したくなるのですが、受け付けてくれません。
|
|
worker.pl
worker.pl
は、キューを処理する、平たく言うと実際に仕事を片付けるのを担当します。
キューに仕事がある限り、順番に処理するのが役目です。
use lib 'lib';
しているのはちゃんと理由があります。
worker.pl
は、ワーカーのクラスを自動的にロードして使ってくれるのですが、今回のディレクトリの構成では、lib
の中にワーカーのクラス(MyTask::Echo
)があるので、予めライブラリがlib
にあることを書いておきます。
|
|
lib/MyTask/Echo.pm
Echo.pm
は、実際の処理の内容です。
client.pl
で、指定しているMyTask::Echo
は、このファイルの事を指しています。
worker.pl
は、このファイルのような仕事の手順書があれば、どのような処理でも実行できます。
なお、perform
は、worker.pl
が呼び出す関数名です。
|
|
main.pl
Proclet
を使って、client.pl
とworker.pl
とRedis
を同時に動かします。
worker.pl
を複数動作させたい場合は、Proclet
のworkerの数を変更するだけなので、いろいろ簡単に試せて便利ですね。
|
|
使い方
当然ですが、Resque
を試すにはRedis
をインストールしておく必要があります。
Mac
でhomebrew
を使っている方は、ターミナルからbrew install redis
と入力するだけです。
その他の方は、Redis
を入れるか、homebrew
を入れるか、Mac
を買うかしてください。
全部コピペしたら、cpanfile
のあるディレクトリで、carton install
と入力してください。
必要なモジュールがインストールされます。
carton
が無い場合は、その前にcpanm Carton
と入力してください。
cpanm
が無い場合は、その前にcurl -L https://cpanmin.us | perl - App::cpanminus
と入力してください。
モジュールのインストールが終わったら、carton exec -- perl main.pl
と入力してみましょう。
勝手に色々動き始めます。
ジョブキューが初めての方は、main.pl
に書いてあるworker
やclient
のworker
を増減してみたり、client.pl
のsleep
を消したり、数値を変更したり、色々試してみてください。
|
|
使ってみての感想
RDBMS
の場合、少なくともテーブル、場合によってはユーザーやデータベースなどを作る必要があり、ちょっと触ってみるにしても結構面倒なところがあります。
Qudo
は、そういう部分のヘルパーもあり、楽チンではあるのですが。
Redis
+Resque
の場合は、そのあたりが何も必要ないので、とても簡単です。
ちょっと使ってみたり、ジョブキューに触れて見るにはちょうど良いと思います。
参考資料
- Resque - Redis-backed library for creating background jobs, placing them on multiple queues, and processing them later. - metacpan.org
- Resque で学ぶジョブキューイング - Perl Advent Calendar Japan 2012 Casual Track
- Qudo - simple and extensible job queue manager - metacpan.org
- 第10回 ジョブキューで後回し大作戦―TheSchwartz,Qudo,Q4M(1):Perl Hackers Hub|gihyo.jp … 技術評論社