@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 … 技術評論社