・ Web系SE募集 (技術開発部開発系エンジニア・Java/Tomcat 420万円~750万円)
   ・ 社内SE募集 (業務系システムの開発・社内イントラ)

POEIKCの最近のブログ記事

POEIKC     http://search.cpan.org/~suzuki/POEIKC-0.04/


2年ほど前のあるWebのシステムで、アクセスの度にリアルタイム処理を行うものを作っておりました。
それは、

HTTPクライアントや、
さまざまな処理を行うワーカー、
集計やログ出力など、
数十台のサーバー上で処理を分担し、
各サーバー間やプロセス間でデータのやりとりをしながら行いました。

それぞれの処理を行うプログラムは
デーモンの様に常駐し、
サーバーの様に処理を受け、
クライアントの様に処理を依頼したりし、
複数のホストにタスクを分担して各ホストやプロセス間でタスクの受け渡しながら、
作業をし続けるプログラムを
用途毎に、幾つも作っていました。

そこで、それらの共通的な要素をいくつもつくる事を考えると楽をしたくなり、
フレームワーク化したものがほしいと考えました。

・どういう工夫をしたのか

1.デーモンとのやりとりを簡単にできるようにクライアントを用意しました。これにより別途クライアントを用意する必要がなくなり、サーバーへの処理依頼を付属のクライアントで行える様になりました。

2.バックグラウンドだけではなく、フォアグラウンドでも動くようにした。これにより標準出力や標準エラーなどを拾いたい時に利用できる。

3.ネットワーク通信・プロセス間通信を行うためPOEを使用しました。これにより、複数のタスクを同時に行う事ができ、リクエストに対するレスポンス待ちといったロスを無くす事ができました。

4.プラグイン的に利用出来るようにしました。これにより、再利用可能なモジュール作りが可能。
    ※今のところ次の2つのプラグインがございます。
POEIKC::Plugin::GlobalQueue ・・・ MessageQueueのようなもの
POEIKC::Plugin::IRC ・・・IRCサーバーへ中継を行うIRCクライアント

5.デーモン(サーバー)間でP2P出来るようにしました。これにより処理毎にプロセスを分け分散処理ができ、負荷分散も可能となった。(同じホスト内でも複数起動可能です)

6.クライアントからデーモンにモジュールをロードできるようにした。これによりリモートでデーモンの設定変更など操作する事が可能。

7.このシステムのベースはPOE::Component::IKCを使用しているのでPOE::Component::IKC:: ClientLite を使う事で、バッチ処理やApacheのプロセスとの通信も可能。

 

前回に引き続き IRCネタです。
IRCサーバーを作った時と同じぐらいの時期に、
をつくりました。
これを作ったきっかけは、SVNでコミット時にメールを送るのに、commit-email.pl を使ってましたが、
こまめにコミットすると、メールに埋もれてしまう~。
という事で、trunk にマージした時のみメールで送る様にし、それ以外は IRCに流そうと思ったわけです。
元ネタは、coderepos のcodereposbot で、codereposbot は コミット時にログを流していたので同じ事を考えました。
で、
commit-email.pl を trunk にコミットした時だけ IRCに情報を流すように少々手を加えます。
その時、バッチ(commit-email.pl)から IRC に手軽に流したいな~。でも。コミットの時だけ IRCに
IRCbotが join して~とかなると、それはそれでわずらわしいしー。とかとか考え、IRCにメッセージを流す中継を行うIRCbotのデーモンを立てるのがいいと思い、手軽にIRCbotを作れるPOEIKC::Plugin::IRC を作ったわけです。
(PoCo::IKCのおかげでデーモンと気軽に会話できるのがいいですね)

POEIKC::Plugin::IRC は、POEIKC の Plugin として使います。
使い方は、POEIKCPOEIKC::Plugin::IRC をインストールしたら、

poeikcd start -M=POEIKC::Plugin::IRC -a=irc_bot -p 6677 -s

として、起動し、svn でメール送信するスクリプト(commit-email.pl)に、

use POE::Component::IKC::ClientLite;

my %param = (
        ip              => Sys::Hostname::hostname,
        port    => 6677,
        name    => join('_'=>Sys::Hostname::hostname, ($0 =~ /(\w+)/g), $$),
);
my $ikc = create_ikc_client(%param);
$ikc or warn $POE::Component::IKC::ClientLite::error;

my @param = ({
        connect=>{
                Nick=>"svn_bot",
                Username=>"svn_bot",
                Ircname=>"svn_bot",
                Port=>"6667",
                flood=>1,
        },
        channel=>"#svn_commit"
});
my $message_respond = 'IKC_IRC/message_respond';
$ikc->post_respond( $message_respond => [@param, $mail_subject]);
$ikc->post_respond( $message_respond => [@param, $mail_body]);
とします。

必要に応じて、trunk にコミットした時だけというロジックを追加したりすれば完成です。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちPOEIKCカテゴリに属しているものが含まれています。

次のカテゴリはshellです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。