AnyEvent::MPRPCでMessagePack RPC

MessagePack RPCは全てのメッセージにシーケンス番号をいれることで、1つのTCP接続でpipeliningのような遅延リターンができる。

Gearmanでやりたかったいめーじはこちらのほうがちかい。


server側

use AnyEvent;
use AnyEvent::MPRPC::Server;


my $server = AnyEvent::MPRPC::Server->new( port => 4423 );
$server->reg_cb(
    'sleep' => sub {
        my ( $res_cv, $sleep ) = @_;
        warn $sleep;
        my $t; $t = AE::timer $sleep, 0 , sub {
                undef $t;
                $res_cv->result("$sleep done!");
            };
    },
);

AE::cv->recv;

client側

my $work_count = 0;
my @sleeps = qw/1 5 2 4 3 2 1/;
my $worked = 0;

my $client = AnyEvent::MPRPC::Client->new(
    host => '127.0.0.1',
    port => 4423,
);

for my $sleep ( @sleeps ) {
    my $n = $work_count++;
    $client->call( 'sleep' => $sleep )->cb( sub {
        my $res = shift->recv;
        warn "$n: $sleep: $res";
        $worked++;
    });
};

my $w; $w = AnyEvent->timer(
    after    => 0,
    interval => 1,
    cb       => sub {
        if ($worked ==  @sleeps) {
            exit;
        }
    }
);

AE::cv->recv;

実行結果

% perl anyevent_mprpc_client.pl0: 1: 1 done! at anyevent_mprpc_client.pl line 20.
6: 1: 1 done! at anyevent_mprpc_client.pl line 20.
2: 2: 2 done! at anyevent_mprpc_client.pl line 20.
5: 2: 2 done! at anyevent_mprpc_client.pl line 20.
4: 3: 3 done! at anyevent_mprpc_client.pl line 20.
3: 4: 4 done! at anyevent_mprpc_client.pl line 20.
1: 5: 5 done! at anyevent_mprpc_client.pl line 20.
created by blog.nomadscafe.jp

コメント

コメントはありません

コメントを投稿

コメントを投稿するにはログインが必要です