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 でチャットサーバを起動して、別のブラウザからそれぞれに接続。送信すると両方のホストで発言が反映されます。