読者です 読者をやめる 読者になる 読者になる

Spread Toolkit で Comet チャットサーバをクラスタリング

PoCo::HTTP で Comet チャットサーバを作る - daily dayflower を試してみた。面白い。
ついでに spread を使って、Comet チャットサーバをクラスタリングする実験をしてみる。

POE::Kernel->run(); の前に、PoCo::SpreadClient もセットアップ。

use POE::Component::SpreadClient;

POE::Component::SpreadClient->spawn( 'spread' );
POE::Session->create(
    inline_states => {
        _start         => \&spread_start,
        _sp_message    => \&spread_message,
    }
);
POE::Kernel->run();

sub spread_start {
    $poe_kernel->alias_set('displayer');
    $poe_kernel->post( spread => connect   => '4803', $$  );
    $poe_kernel->post( spread => subscribe => 'comet' );
}

sub spread_message {
    my $msg = pop @_;
    broadcast_message($msg);
}

write_content で、直接 broadcast_message() する代わりに spread にメッセージを投げる。そのメッセージを受信したら broadcast_message()、という流れ。
つまり、broadcast_message() を一旦 spread を間に挟んで叩くと。

sub write_content {
    ### write_content...
    my ($req, $res) = @_;

    use CGI;
    my $q = CGI->new($req->content);

    $poe_kernel->post( spread => publish => 'comet', $q->param('body') );

    $req->headers->header(Connection => 'close');

    standard_response($res, 'text/plain');
    $res->content("sent\n");

    return RC_OK;
}

こうすれば、チャットサーバを複数台でクラスタリング出来る! (はず)。
実際 2台で試してみたら出来ました。host1:8888, host2:8888 でチャットサーバを起動して、別のブラウザからそれぞれに接続。送信すると両方のホストで発言が反映されます。