2011-12-10 95 views
1

我需要实现一个守护进程来使用Perl来驱动网络服务监视探针。在Perl中寻求关于pre-forking master/worker守护进程的实现建议

守护程序应该预分配一个配置数量的工作程序和一个主进程以从数据库中获取预定的探测,并将消息传递给将运行探测并将结果插入数据库的工作人员。从主人到工人的单向沟通应该是足够的。

我已经使用Proc :: Daemon和IO :: Pipe为主从IPC开发了一些代码,但每一次尝试都以挫败感告终。对于它的价值,我没有任何示例可以呈现,他们可能只会分心真实的问题。

是我的设计,比如说,是不是?

我见过几个POD页面和教程,涵盖了我的需求的一小部分,但没有填充主从IPC上的空白。任何人都可以提供可能帮助我理解如何实现这一点的文章的链接?

回答

2

听起来像是一个HTTP工作。为什么在CPAN上有某些东西时实施预分叉服务器?从cron

use LWP::UserAgent; 
sub fetch_probes { ... }; 

my %probe_data = fetch_probes; 
my $ua = LWP::UserAgent->new; 
my $res = $ua->post('http://localhost:5000', \%probe_data); 
die $res->status_line unless $res->is_success; 

worker.psgi


master.pl,进度,启动应用程序与starman --workers 32 --listen :5000

use Plack::Request; 

sub run_probe { ... }; 
sub insert_db { ... }; # DBIx::Class magic goes here! 

my $app = sub { 
    my ($env) = @_; 
    my $req = Plack::Request->new($env); 
    my %probe_data = %{ $req->parameters }; 
    my $results = run_probe(%probe_data); 
    return [200, ['Content-Type' => 'text/plain'], ['ok']] if insert_db($results); 
    return [500, ['Content-Type' => 'text/plain'], ['the error message']]; 
} 
+0

这是一个很好的建议,谢谢。唯一的问题是,我需要比cron提供的更短的时间间隔,并且我将运行足够多的探测器,以便将它们全部安排在相同的时间间隔上运行,这将导致资源问题。 – converter42

+1

这是一个完全正交的问题。在http://stackoverflow.com/a/7532763/46395我演示了如何每半秒运行一段代码。 – daxim