だいぶ以前 Plack::Server::AnyEvent::Prefork というのを書いて某所で使っていたのですが、ここ数日で事例がもうひとつ増えたついでに Twiggy ベースに書き直してCPANリリースしました。

https://metacpan.org/module/Twiggy::Prefork

使うには、

$ plackup -s Twiggy::Prefork -a app.psgi

な感じで、Server::Starterにも対応しているので、

$ start_server --port 5000 -- plackup -s Twiggy::Prefork -a app.psgi

とすれば、hot-deployも可能です。

起動オプションは、Twiggyがサポートしているオプションに加えて、

  • —max-workers preforkするworker数
  • —max-reqs-per-child 1プロセスあたりのリクエスト数
  • —min-reqs-per-child 1プロセスあたりの最小リクエスト数。maxとminとの間でランダムな数字になる

の3つが追加されています。

あと、psgix.exit_guardというリクエストの環境変数からサーバ内部の Condition Variables にアクセスができるようにしてあります。これを使うと 優雅にgraceful shutdownが実現できます。

以下はその例。max-reqs-per-childに達したあと、すぐにプロセスが終了せずに、1個目のasync内のジョブがすべて解消されるまでは待ちます。

use Coro;
use AnyEvent;

my $channel = Coro::Channel->new(100);

async {
  while(1){
    my $q = $channel->get;
    # works..
    $q[0]->end;
  }
};

#psgi app
sub {
  my $env = shift;
  my $cv = AE::cv;
  async {
    $env->{psgix.exit_guard}->begin; 
    $channel->put([$env->{psgix.exit_guard}]);
    $cv->send;
  };
  return sun {
    my $start_response = shift;
    $cv->cb(sub {
      $start_response->([200,['Content-Type'=>'text/plain'],['OK']]);
    });
  }
}

Plack::Server::AnyEvent::Preforkはすでに動作実績があり、そのコードをベースにしているので比較的安心して使えると思います。どうぞお試しください。

このブログ記事について

このページは、Masahiro Naganoが2012年5月31日 16:22に書いたブログ記事です。

ひとつ前のブログ記事は「CloudForecast で Redis の監視」です。

次のブログ記事は「MySQL Beginners Talk で LT してきました」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja