Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
実践で使える拙作npmモジュール
twitter.com/maaash
github.com/mash
無職

なのに実践って??
1. imagemagick-native
https://github.com/mash/node-imagemagick-native
Imagemagick's Magick++ binding for Node.
% brew inst...
1. imagemagick-native
サムネイルの動的生成
いろいろなサイズの画像へのリクエストがある、
UI改善するために異なるサイズを試したい
× 画像アップロード直後にサムネイルを生成
○ サムネイルへのリクエストが来てから画像を生...
1. imagemagick-native
サムネイルの動的生成
1. HTTPリクエストを受ける
2. 画像ストレージ(S3など)から元画像を取得
3. サムネイルを生成
4. 保存(memcachedなど)
5. レスポンスを返す
1. imagemagick-native
サムネイルの動的生成
1. HTTPリクエストを受ける
2. 画像ストレージ(S3など)から元画像を取得 (IO)
3. サムネイルを生成 (CPU)
4. 保存(memcachedなど) (IO)
...
1. imagemagick-native
% npm install imagemagick
実体は
require(“child_process”).spawn(“convert”,
args);
% npm install imagema...
app.get( "/*", function (req, res) {
async.waterfall([
function (options, callback) {
var requestOptions = parse( req.url ...
1. imagemagick-native
API群
* convert
* identify
* quantizeColors
* composite

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

自分がつくったのはこれだけ
pullreq
pullreq
pullreq
1. imagemagick-native

うれしい
2. angel
https://github.com/mash/node-angel
gracefully restart multi process net.Servers
% npm install angel
2. angel

昨日 npm publish しました
2. angel
じわじわ系メモリリーク
数10MB/月
2. angel

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

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

max_requests_per_child
一定のリクエスト数をこなした
workerはいったん殺してforkしなおす
これができるのが見当たらなかったので
作ってみたのが angel
2. angel
net.Serverのインスタンスとportを渡すと
CPU数分、プロセス起動してlistenしてくれる
* workerが突然死したら生き返らせてくれる
* HUPシグナルをmasterに送るとworkerを生き返らせ
てく...
CC BY-NC pedra_uding
http://www.flickr.com/photos/petra_uding/6166961931/
2. angel

名前がかっこいいですね
2. angel
var angel = require("angel");
var server = require("http").createServer( function(req, res)
{
res.writeHead(200);...
2. angel
% angel --port 3000 
--workers 4 
--max-requests-per-child 10000 
--refresh-modules-regexp “lib/”
app.js
% cat ap...
2. angel
% node eg/server.js
master[70402] created pid_file: angel.pid
master[70402] master will fork 4 workers
master[704...
2. angel
% pstree -p 70402
| |
-+= 55828 mash /bin/zsh
| |
-+= 70402 mash node eg/server.js
| |
|--- 70403 mash snip/proj/...
2. angel
master[70402]
master[70402]
master[70402]
master[70402]
master[70402]
master[70402]
worker[70560]
worker[70560]
w...
2. angel

名前がかっこいいですね
2. angel

pullreq お待ちしております
Thank you
twitter.com/maaash
github.com/mash
Upcoming SlideShare
Loading in …5
×

Nodefest2013 my npm modules

6,716 views

Published on

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

  • Be the first to comment

  • Be the first to like this

Nodefest2013 my npm modules

  1. 1. 実践で使える拙作npmモジュール twitter.com/maaash github.com/mash
  2. 2. 無職 なのに実践って??
  3. 3. 1. imagemagick-native https://github.com/mash/node-imagemagick-native Imagemagick's Magick++ binding for Node. % brew install imagemagick % npm install imagemagick-native
  4. 4. 1. imagemagick-native サムネイルの動的生成 いろいろなサイズの画像へのリクエストがある、 UI改善するために異なるサイズを試したい × 画像アップロード直後にサムネイルを生成 ○ サムネイルへのリクエストが来てから画像を生成
  5. 5. 1. imagemagick-native サムネイルの動的生成 1. HTTPリクエストを受ける 2. 画像ストレージ(S3など)から元画像を取得 3. サムネイルを生成 4. 保存(memcachedなど) 5. レスポンスを返す
  6. 6. 1. imagemagick-native サムネイルの動的生成 1. HTTPリクエストを受ける 2. 画像ストレージ(S3など)から元画像を取得 (IO) 3. サムネイルを生成 (CPU) 4. 保存(memcachedなど) (IO) 5. レスポンスを返す IOで詰まったら同期IOなworkerは詰まっちゃうんじゃ? → node.jsでやったらどうか
  7. 7. 1. imagemagick-native % npm install imagemagick 実体は require(“child_process”).spawn(“convert”, args); % npm install imagemagick-native ImageMagickのC++ Bindingを使う imagemagick: 8.07ms per iteration imagemagick-native: 0.87ms per iteration
  8. 8. 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 ); });
  9. 9. 1. imagemagick-native API群 * convert * identify * quantizeColors * composite サイズ、形式の変換 サイズや形式を識別 量子化 合成
  10. 10. 1. imagemagick-native API群 * convert * identify * quantizeColors * composite 自分がつくったのはこれだけ pullreq pullreq pullreq
  11. 11. 1. imagemagick-native うれしい
  12. 12. 2. angel https://github.com/mash/node-angel gracefully restart multi process net.Servers % npm install angel
  13. 13. 2. angel 昨日 npm publish しました
  14. 14. 2. angel じわじわ系メモリリーク 数10MB/月
  15. 15. 2. angel おれのせいじゃないよ〜>< って言いたい
  16. 16. 2. angel 定期的にcronで殺したりして(しないか)
  17. 17. 2. angel max_requests_per_child 一定のリクエスト数をこなした workerはいったん殺してforkしなおす これができるのが見当たらなかったので 作ってみたのが angel
  18. 18. 2. angel net.Serverのインスタンスとportを渡すと CPU数分、プロセス起動してlistenしてくれる * workerが突然死したら生き返らせてくれる * HUPシグナルをmasterに送るとworkerを生き返らせ てくれる * その時モジュールを読み込みなおせる =無停止デプロイ
  19. 19. CC BY-NC pedra_uding http://www.flickr.com/photos/petra_uding/6166961931/
  20. 20. 2. angel 名前がかっこいいですね
  21. 21. 2. angel var angel = require("angel"); var server = require("http").createServer( function(req, res) { res.writeHead(200); res.end("Hello, World!"); }); angel( app, { port: refresh_modules_regexp: max_requests_per_child: workers: }); 3000, "(config|lib)/", 10000, 4
  22. 22. 2. angel % angel --port 3000 --workers 4 --max-requests-per-child 10000 --refresh-modules-regexp “lib/” app.js % cat app.js var server = require("http").createServer( function(req, res) { res.writeHead(200); res.end("Hello, World!"); }); module.exports = server;
  23. 23. 2. angel % node eg/server.js master[70402] created pid_file: angel.pid master[70402] master will fork 4 workers master[70402] forked worker[70403] master[70402] forked worker[70404] master[70402] forked worker[70405] master[70402] forked worker[70406] worker[70404] launched worker[70404] listening on 3000 worker[70406] launched worker[70406] listening on 3000 worker[70403] launched worker[70405] launched worker[70403] listening on 3000 worker[70405] listening on 3000
  24. 24. 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
  25. 25. 2. angel master[70402] master[70402] master[70402] master[70402] master[70402] master[70402] worker[70560] worker[70560] worker[70561] worker[70561] worker[70559] worker[70559] worker[70562] worker[70562] worker[70403] master[70402] worker[70404] worker[70405] master[70402] master[70402] worker[70406] master[70402] SIGHUP reloaded snip/proj/node-angel/eg/app.js forked worker[70559] forked worker[70560] forked worker[70561] forked worker[70562] launched listening on 3000 launched listening on 3000 launched listening on 3000 launched listening on 3000 closes worker[70403] died closes closes worker[70405] died worker[70404] died closes worker[70406] died
  26. 26. 2. angel 名前がかっこいいですね
  27. 27. 2. angel pullreq お待ちしております
  28. 28. Thank you twitter.com/maaash github.com/mash

×