Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

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)],
    },
});

みたいにしてやるだけです。詳しくは以下を。

https://github.com/kentaro/perl-mankiw/tree/master/t