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のプロセスとの通信も可能。