Ищу советы по внедрению pre-разветвления мастер / рабочий демон в Perl - PullRequest
1 голос
/ 11 декабря 2011

Мне нужно реализовать демон для управления зондами мониторинга сетевых служб с помощью Perl.

Демон должен предварительно сконфигурировать сконфигурированное количество рабочих и главный процесс для выборки запланированных тестов из базы данных и передачи сообщений рабочим, которые будут запускать тесты и вставлять результаты в базу данных. Одностороннее общение между мастером и рабочим должно быть достаточным.

Я играл с некоторым кодом, используя Proc :: Daemon и IO :: Pipe для IPC «мастер-рабочий», но каждая попытка заканчивалась разочарованием. Что бы это ни стоило, у меня нет примеров, чтобы представить, и они, вероятно, в любом случае отвлекут от реального вопроса.

Мой дизайн, как он есть, звучит?

Я видел несколько страниц и учебных пособий по POD, в которых рассказывалось о моих требованиях, но ни одна из них не содержала пробелов в IPC «мастер-работник». Кто-нибудь может предложить ссылки на статьи, которые могут помочь мне понять, как это реализовать?

1 Ответ

2 голосов
/ 11 декабря 2011

Похоже, работа для HTTP. Зачем внедрять сервер предварительной разветвления, если в CPAN уже есть что-то?


master.pl , расписание от 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 , запустите приложение с 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']];
}
...