2015-02-18 2 views
2

Я использую Net :: Server :: Prefork для запуска TCP-сервера. Процедура запуска выглядит следующим образом:Perl Net :: Горячее развертывание сервера

use 5.10.1; 
use strict; 
use warnings; 
use parent 'Net::Server::Fork'; 

     Dispatcher->run(
      'host'   => $host         || '*', 
      'port'   => $port         || 7000, 
      'ipv'    => '*', 
      'log_level'  => $main::config{'backend.loglevel'}  || 0, 
      'log_file'  => $main::config{'backend.logfile'}  || undef, 
      'pid_file'  => $main::config{'backend.pidfile'}  || undef, 
      'user'   => $main::config{'backend.user'}   || 'nobody', 
      'group'   => $main::config{'backend.group'}   || 'nogroup', 
      'max_servers'  => $main::config{'backend.maxconnections'} || 3, 
      'background'  => !$main::config{'backend.foreground'} || undef, 
      'allow'   => $main::config{'ip'}      || '.*', 
      'reverse_lookups' => 1, 
     ); 

грузоотправитель использует эту функцию для обработки запросов:

sub process_request { 
    eval { 
     local $SIG{'ALRM'} = sub { die "Timed Out!\n" }; 
     my $previous_alarm = alarm($timeout); 
     my @args; 
     { 
      my $command = <STDIN>; 
      @args = split /\s+/, $command; 
      alarm($timeout); 
     } 

     alarm(($main::config{'timeout'} + 5) || 185); 
     { 
      Dispatcher::main(@args); 
     } 
     alarm($previous_alarm); 
    }; 
}; 

Теперь это все хорошо. Однако при обновлении сервера у меня в настоящее время возникает проблема: чтобы не убивать запросы, которые находятся в процессе обработки, я должен проверить активные процессы и подождать, пока они не будут завершены с дополнительной проблемой, которая при ожидании новых клиентов может подключиться. Итак, есть ли возможность «поэтапного отказа» от выполняемых дочерних процессов, т. Е. Прекратить простаивающие процессы, заменить их новой версией и заменить каждый запущенный (старый) процесс новой версией после завершения старого процесса?

В качестве альтернативы, можно ли блокировать входящие соединения, пока все старые дочерние процессы не будут завершены, а затем перезагрузите сервер в целом? Я думал об этом с временными правилами брандмауэра, но мне бы очень хотелось, чтобы Perl справился с этим.

Любые идеи оцениваются!

ответ

1

Вы использовали функцию конфигурации leave_children_open_on_hup и перезапустите сервер, используя HUP сигнал? [рецепт для linux/unix]
Он должен работать в соответствии с документацией.

Net::Server Restarting

+0

Нет. Правда, я пропустил это, так что спасибо за указав его. Я попробую это решение и вернусь, как только это сработает – Marcus

+0

Я добавил 'leave_children_open_on_hup' в конфигурацию, и это в основном делает трюк. Однако поступающие запросы останавливаются. strace показывает, что они застревают в считывающем самолете. Во всяком случае, я принял ваше решение, но я остался с некоторым рытьем о том, почему время прочтения. – Marcus

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