Gearmanを使ってみた

YAPC Asia 2007でも紹介されていたGearmanと言うjob serverを使ってみました。

追記(2007-05-01)

  • gearmandをgearmanとしていたので修正
  • $worker->work while 1; が抜けていたので追加(thanks id:tokuhirom)
  • pperlでの検証結果を最後に触れておきました。

インストール

gearmand, GearmanをそれぞれCPANから入れるだけです。

daemonの起動

下記のようにdaemonとして起動します。

daemon起動オプションに関してですが、PODの記載は誤りで--daemonizeでは無く--daemonです。

$  sudo gearmand --daemon --pidfile=/var/log/gearmand.pid --debug=1

関数の登録

次にgearmanに実行させたい処理を予め登録し、さらにjob queを待ち受けるworkerを記述します。

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dump qw(dump);
use Gearman::Worker;
use Storable qw(thaw);
use List::Util qw(sum);

my $worker = Gearman::Worker->new;
$worker->job_servers(qw|localhost|);
$worker->register_function(
    sum => sub {
        my $job = shift;
        my @args = @{thaw($job->arg)};

        return sum @args;
    }
);
$worker->work while 1;

task_sum.plなどとして保存して実行します。

注意する所としては下記のような所でしょうか。

  • 登録した関数に渡される第1引数はGearman::Jobオブジェクト
  • argはtaskから渡されたSCALAR化した引数、argrefはそのリファレンス
  • networkをまたがるのでStorableのようなシリアライザーが必須(無いと不便過ぎ。)

func_sum.plなど適当なファイル名で保存し、実行しておきます。

Execute Task

登録したsumを実際に実行する例です。


#!/usr/bin/perl

use strict;
use warnings;

use Data::Dump qw(dump);
use Storable qw(freeze thaw);
use Gearman::Client;
use Gearman::Task;

my $client = Gearman::Client->new;
$client->job_servers(qw|localhost|);

my $args = freeze([1..9]);

my $result_ref = $client->do_task("sum", \$args, {
});
print $$result_ref;

45と表示されれば成功です。

注意する点は単純なスカラー以外を渡す際は、いったんそのリファレンス(配列、ハッシュ、追いブジェクトなどなど)を一度Storableのfleezeにかましてスカラー化した物をリファレンスとして渡すと関数に対して事実上なんでも渡せる事になります。
この辺りがドキュメントが乏しいので分かりづらかったです。

まとめ

実際動かしてみた時の疑問点、TODOです。

  • register_functionはPPerlなどで永続化しておくと良いかも。まだ未検証。検証しました。pperl使う意味は元々無いですし、実際ベンチ取ったらpperlの方が遅いです。
  • 分散環境でどう動くかまだソース読んでないので分からない。register_functionは実際にtaskを処理するサーバー全部でやるんだろうか。
  • ハンドラ(on_complete, on_fail)はまだ試してない
  • background動作もまだ未検証

実際のプロジェクトに組み込むにはノウハウがまだ自分に足りてないなと思いました。とは言え面白いプロダクトだと思います。

comment

Comment Form
remember info

trackback

trackback url
trackback count
0
Recent Entries
  1. perlで気軽にsitemap.xmlを作る
  2. XULでCanvasエディターを作ってみた
  3. nsIObserverServiceを使って複数のobserverに通知を行う
  4. CGI::Application::Plugin::Cache::Adaptive Release
  5. Gearmanを使ってみた
  6. 「正しくHTMLを書こうと心がけている人に5つの質問」の回答
  7. Modules in Games-Nintendo-Wii-Mii
  8. Module-Starterのカスタマイズ
  9. JSON::DWIW vs JSON::Syck vs JSON
  10. よろしくお願い致します
Archives
  1. 2008年02月 (1)
  2. 2007年06月 (2)
  3. 2007年05月 (1)
  4. 2007年04月 (4)
  5. 2007年03月 (2)

all

categories
RSS/Atom Feed
license
Creative Commons License
Powered by