IT Office Nishimiyahara

個人用スマホから商用プログラミングまでなんでもお任せ下さい

Resqueでメッセージキューをやってみた

   

@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.plworker.plRedisを同時に動かします。

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に書いてあるworkerclientworkerを増減してみたり、client.plsleepを消したり、数値を変更したり、色々試してみてください。

使ってみての感想

RDBMSの場合、少なくともテーブル、場合によってはユーザーやデータベースなどを作る必要があり、ちょっと触ってみるにしても結構面倒なところがあります。

Qudoは、そういう部分のヘルパーもあり、楽チンではあるのですが。

Redis+Resqueの場合は、そのあたりが何も必要ないので、とても簡単です。

ちょっと使ってみたり、ジョブキューに触れて見るにはちょうど良いと思います。

参考資料

respo

respo link

ZenBackWidget

 - 情報技術について , ,