Я использую perl's Net::Stomp
поверх RabbitMQ для установки очень простой межплатформенной распределенной рабочей очереди. Идея состоит в том, чтобы отправить кучу заданий на одно имя очереди и заставить несколько рабочих снять задания и выполнить их.Подписчики, подключающиеся к очереди STOMP, не добавляются к круговому распределению
Если я запускаю «рабочих» и отправляю кадры/задания в очередь, я получаю именно то, что я ожидаю: рабочие выходят из очереди в очереди круговым способом.
Если я отправляю задания в постоянную очередь, а затем запускаю несколько рабочих, только первые вытягивают задания из очереди.
# submit.pl
use Net::Stomp;
use JSON::PP;
my $stomp = Net::Stomp->new({ hostname => 'localhost', port => '61613' });
$stomp->connect({ login => 'a', passcode => 'a' }) or die;
for (my $i=0; $i < 20; $i++) {
my $package = encode_json({ seed => $i });
$stomp->send({ destination => '/queue/runs', body => $package });
}
$stomp->disconnect;
# worker.pl
my $stomp = Net::Stomp->new({ hostname => 'localhost', port => '61613' });
$stomp->connect({ login => 'a', passcode => 'a' });
$stomp->subscribe({
destination => '/queue/runs',
ack => 'client',
'activemq.prefetchSize' => 1 });
while (my $frame = $stomp->receive_frame) {
next unless defined $frame;
$stomp->ack({ frame => $frame });
next unless $frame->body;
my $spec = decode_json $frame->body;
say $$ . " " . $spec->{seed};
sleep 1;
}
Запуск этого:
$ perl submit.pl && perl worker.pl & perl worker.pl
Что я ожидал увидеть что-то вроде:
30026 0
30024 1
30026 2
30024 3
...
Вместо этого я вижу только первый "рабочий" вытягивать кадры из очереди. Если я убью первый «рабочий» процесс, второй начнет вытягивать фреймы.
30024 0
30024 1
30024 2
30024 3
...
Я хотел бы, чтобы это было так, что сразу же, как рабочие подписываться на очереди, они начинают вытягивать кадры в циклическом режиме. Я бы предпочел не писать конкретные вещи, чтобы справиться с этим. Я предполагаю, что в протоколе есть какой-то механизм, который я пропускаю, или, возможно, ошибка в Net::Stomp
?
Как я уже сказал, круговая диспетчеризация отлично работает, если рабочие работают до того, как запущен submit.pl
.