Gearmanを使ってみた
YAPC Asia 2007でも紹介されていたGearmanと言うjob serverを使ってみました。
追記(2007-05-01)
- gearmandをgearmanとしていたので修正
- $worker->work while 1; が抜けていたので追加(thanks id:tokuhirom)
- pperlでの検証結果を最後に触れておきました。
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動作もまだ未検証
実際のプロジェクトに組み込むにはノウハウがまだ自分に足りてないなと思いました。とは言え面白いプロダクトだと思います。
trackback
- trackback url
- trackback count
- 0
comment