28
実践で使える拙作npmモジュール twitter.com/maaash github.com/mash

Nodefest2013 my npm modules

Embed Size (px)

DESCRIPTION

https://github.com/mash/node-imagemagick-native ImageMagick's Magick++ bindings for NodeJS https://github.com/mash/node-angel angel.js is a simple library to gracefully restart multi process net.Servers on node >= 0.6

Citation preview

Page 1: Nodefest2013 my npm modules

実践で使える拙作npmモジュール

twitter.com/maaashgithub.com/mash

Page 2: Nodefest2013 my npm modules

無職

なのに実践って??

Page 3: Nodefest2013 my npm modules

1. imagemagick-native

https://github.com/mash/node-imagemagick-nativeImagemagick's Magick++ binding for Node.

% brew install imagemagick % npm install imagemagick-native

Page 4: Nodefest2013 my npm modules

1. imagemagick-native

サムネイルの動的生成

いろいろなサイズの画像へのリクエストがある、

UI改善するために異なるサイズを試したい

× 画像アップロード直後にサムネイルを生成

○ サムネイルへのリクエストが来てから画像を生成

Page 5: Nodefest2013 my npm modules

1. imagemagick-native

サムネイルの動的生成

1. HTTPリクエストを受ける

2. 画像ストレージ(S3など)から元画像を取得

3. サムネイルを生成

4. 保存(memcachedなど)5. レスポンスを返す

Page 6: Nodefest2013 my npm modules

1. imagemagick-native

サムネイルの動的生成

1. HTTPリクエストを受ける

2. 画像ストレージ(S3など)から元画像を取得 (IO)3. サムネイルを生成 (CPU)4. 保存(memcachedなど) (IO)5. レスポンスを返す

IOで詰まったら同期IOなworkerは詰まっちゃうんじゃ?→ node.jsでやったらどうか

Page 7: Nodefest2013 my npm modules

1. imagemagick-native% npm install imagemagick実体はrequire(“child_process”).spawn(“convert”, args);

% npm install imagemagick-nativeImageMagickのC++ Bindingを使う

imagemagick: 8.07ms per iterationimagemagick-native: 0.87ms per iteration

Page 8: Nodefest2013 my npm modules

app.get( "/*", function (req, res) { async.waterfall([ function (options, callback) { var requestOptions = parse( req.url ); // download from s3 request.get( requestOptions, function(err,res,body) { callback( null, body, resizeOptions ); }); }, function (body, resizeOptions, callback) { var buf; try { buf = imagemagick.convert( resizeOptions ); } catch (e) { // handle error }; callback( null, buf ); }, function (buf) { // store cache.set(key, buf); }, function (buf) { // respond res.end(buf); callback( null ); } ], errorHandler );});

Page 9: Nodefest2013 my npm modules

1. imagemagick-nativeAPI群* convert サイズ、形式の変換* identify サイズや形式を識別* quantizeColors 量子化* composite 合成

Page 10: Nodefest2013 my npm modules

1. imagemagick-nativeAPI群* convert 自分がつくったのはこれだけ* identify pullreq* quantizeColors pullreq* composite pullreq

Page 11: Nodefest2013 my npm modules

1. imagemagick-native

うれしい

Page 12: Nodefest2013 my npm modules

2. angel

https://github.com/mash/node-angelgracefully restart multi process net.Servers

% npm install angel

Page 13: Nodefest2013 my npm modules

2. angel

昨日 npm publish しました

Page 14: Nodefest2013 my npm modules

2. angel

じわじわ系メモリリーク数10MB/月

Page 15: Nodefest2013 my npm modules

2. angel

おれのせいじゃないよ〜><って言いたい

Page 16: Nodefest2013 my npm modules

2. angel

定期的にcronで殺したりして(しないか)

Page 17: Nodefest2013 my npm modules

2. angel

max_requests_per_child

一定のリクエスト数をこなしたworkerはいったん殺してforkしなおす

これができるのが見当たらなかったので作ってみたのが angel

Page 18: Nodefest2013 my npm modules

2. angel

net.Serverのインスタンスとportを渡すとCPU数分、プロセス起動してlistenしてくれる

* workerが突然死したら生き返らせてくれる* HUPシグナルをmasterに送るとworkerを生き返らせてくれる* その時モジュールを読み込みなおせる =無停止デプロイ

Page 19: Nodefest2013 my npm modules

CC BY-NC pedra_udinghttp://www.flickr.com/photos/petra_uding/6166961931/

Page 20: Nodefest2013 my npm modules

2. angel

名前がかっこいいですね

Page 21: Nodefest2013 my npm modules

2. angel

var angel = require("angel");var server = require("http").createServer( function(req, res) { res.writeHead(200); res.end("Hello, World!");});

angel( app, { port: 3000, refresh_modules_regexp: "(config|lib)/", max_requests_per_child: 10000, workers: 4});

Page 22: Nodefest2013 my npm modules

2. angel

% angel --port 3000 \ --workers 4 \ --max-requests-per-child 10000 \ --refresh-modules-regexp “lib/”\ app.js

% cat app.jsvar server = require("http").createServer( function(req, res) { res.writeHead(200); res.end("Hello, World!");});module.exports = server;

Page 23: Nodefest2013 my npm modules

2. angel

% node eg/server.jsmaster[70402] created pid_file: angel.pidmaster[70402] master will fork 4 workersmaster[70402] forked worker[70403]master[70402] forked worker[70404]master[70402] forked worker[70405]master[70402] forked worker[70406]worker[70404] launchedworker[70404] listening on 3000worker[70406] launchedworker[70406] listening on 3000worker[70403] launchedworker[70405] launchedworker[70403] listening on 3000worker[70405] listening on 3000

Page 24: Nodefest2013 my npm modules

2. angel% pstree -p 70402 | | \-+= 55828 mash /bin/zsh | | \-+= 70402 mash node eg/server.js | | |--- 70403 mash snip/proj/node-angel/eg/server.js | | |--- 70404 mash snip/proj/node-angel/eg/server.js | | |--- 70405 mash snip/proj/node-angel/eg/server.js | | \--- 70406 mash snip/proj/node-angel/eg/server.js

Page 25: Nodefest2013 my npm modules

2. angelmaster[70402] SIGHUPmaster[70402] reloaded snip/proj/node-angel/eg/app.jsmaster[70402] forked worker[70559]master[70402] forked worker[70560]master[70402] forked worker[70561]master[70402] forked worker[70562]worker[70560] launchedworker[70560] listening on 3000worker[70561] launchedworker[70561] listening on 3000worker[70559] launchedworker[70559] listening on 3000worker[70562] launchedworker[70562] listening on 3000worker[70403] closesmaster[70402] worker[70403] diedworker[70404] closesworker[70405] closesmaster[70402] worker[70405] diedmaster[70402] worker[70404] diedworker[70406] closesmaster[70402] worker[70406] died

Page 26: Nodefest2013 my npm modules

2. angel

名前がかっこいいですね

Page 27: Nodefest2013 my npm modules

2. angel

pullreq お待ちしております

Page 28: Nodefest2013 my npm modules

Thank you

twitter.com/maaashgithub.com/mash