2017-01-05 10 views
0

Я использую 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.

ответ

0

В плагине STOMP от Rabbitmq ключ activemq.prefetchSize, указанный в документации Net::Stomp, ничего не делает. Все, что мне нужно было сделать, это изменить его на 'prefetch-count' => 1, а затем все это сработало, как я и ожидал.

 Смежные вопросы

  • Нет связанных вопросов^_^