MankiwでGearman/TheSchwartzのclient/workerをいい感じにする
Gearmanのはまりどころというエントリを見て、以前Mankiwというものを書いたのを思い出したので書いておきます。
これはなにをするものかってーと、上記エントリの問題点をわりと解消する感じになっていて、
- Gearmanのドキュメントはかなり酷い感じになっていて、実際の機能と齟齬がありまくる
- TheSchwartz/Gearmanのclient/workerのインタフェイスを統一
- メソッドを統一
- TheSchwartzはリファレンスをわたせるけどGearmanはだめなのを統一
- Parallel::ForkManagerなworker managerもついてるよ
- HUPでリロード(設定ファイル読み直し)もできるよ
というところが利点かなと思っております……が、まだ実践投入できてないので、あれなところもあるかもしれませんが……。
以下、Gearmanの例を挙げますが、TheSchwartzのclient/workerでも同じように使えます。
Gearmanの例
- workerクラス
- functionクラス
を用意し、それを設定ファイルに書いておきます。
設定ファイル:
job_servers: - 127.0.0.1 worker_class: My::Gearman::Worker worker_functions: - My::Gearman::Function::Foo max_workers: 3 max_works_per_child: 10 env: MANKIW_DEBUG: 1 include_paths: - t/lib
My::Gearman::Worker:
package My::Gearman::Worker; use strict; use warnings; use parent qw(Mankiw::Gearman::Worker); !!1;
My::Gearman::Function::Foo:
package My::Gearman::Function::Foo; use strict; use warnings; use parent qw(Mankiw::Gearman::Worker::Base); sub work { my ($class, $job) = @_; my $bar = $job->arg->{bar}; my $baz = $job->arg->{hoge}; # ... do something ... } !!1;
んでもってworker managerを起動。
$ perl mankiw.pl -c 設定ファイル
あとはclientから
my $client = Mankiw::Gearman::Client->new(job_servers => ['127.0.0.1']); my $result = $client->insert('My::Gearman::Function::Foo' => { args => { bar => 'baz', hoge => [qw(fuga piyo)], }, });
みたいにしてやるだけです。詳しくは以下を。