Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
おまいらちゃんとリソース解放してますか / Remember to close resources!
Search
shimataro
November 23, 2018
Technology
2
1.2k
おまいらちゃんとリソース解放してますか / Remember to close resources!
東京Node学園祭2018の発表資料です
https://nodefest.jp/2018/
shimataro
November 23, 2018
Tweet
Share
More Decks by shimataro
See All by shimataro
作って理解するPromise / Let's try implementing Promise
shimataro
0
29
Single Executable Applicationsについて / About Single Executable Applications
shimataro
0
1.9k
パッケージ開発者の苦悩 -JavaScriptランタイム群雄割拠- / distress of package developer
shimataro
0
710
An introduction to Node.js
shimataro
0
300
KFDのススメ / About KFD
shimataro
3
830
Node.js v12のES Modules / ES Modules on NodeJS v12
shimataro
1
1.2k
CJSとESMとnpmパッケージ / CommonJS and ES Modules and npm package
shimataro
0
820
BigInt あれこれ / overview about BigInt
shimataro
0
940
dynamic import あれこれ / dynamic import - overview and pitfalls
shimataro
1
840
Other Decks in Technology
See All in Technology
日本の85%が使う公共SaaSは、どう育ったのか
taketakekaho
1
150
20260204_Midosuji_Tech
takuyay0ne
1
150
データの整合性を保ちたいだけなんだ
shoheimitani
8
3.1k
IaaS/SaaS管理における SREの実践 - SRE Kaigi 2026
bbqallstars
4
2.1k
CDKで始めるTypeScript開発のススメ
tsukuboshi
1
390
30万人の同時アクセスに耐えたい!新サービスの盤石なリリースを支える負荷試験 / SRE Kaigi 2026
genda
4
1.2k
M&A 後の統合をどう進めるか ─ ナレッジワーク × Poetics が実践した組織とシステムの融合
kworkdev
PRO
1
430
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1k
Amazon S3 Vectorsを使って資格勉強用AIエージェントを構築してみた
usanchuu
3
450
インフラエンジニア必見!Kubernetesを用いたクラウドネイティブ設計ポイント大全
daitak
1
360
15 years with Rails and DDD (AI Edition)
andrzejkrzywda
0
190
茨城の思い出を振り返る ~CDKのセキュリティを添えて~ / 20260201 Mitsutoshi Matsuo
shift_evolve
PRO
1
250
Featured
See All Featured
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
240
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Amusing Abliteration
ianozsvald
0
100
Game over? The fight for quality and originality in the time of robots
wayneb77
1
110
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.9k
What's in a price? How to price your products and services
michaelherold
247
13k
How to make the Groovebox
asonas
2
1.9k
Art, The Web, and Tiny UX
lynnandtonic
304
21k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
110
Transcript
おまいらちゃんと おまいらちゃんと リソース解放してますか リソース解放してますか (2018/11/23) (2018/11/23) ⼩⽥島 太郎 / @shimataro
東京NODE 学園祭2018 DAY #1 東京NODE 学園祭2018 DAY #1
⾃⼰紹介 ⾃⼰紹介 / / / ウェブリオ株式会社所属(京都) サーバサイド / インフラエンジニア 趣味は⼿品
⼿品業界→Web 業界 最近は ⼿打ちうどん にハマりかけてます ⼩⽥島 太郎 shimataro@GitHub odashima.taro@Facebook shimataro999@Twitter
この発表について この発表について 対象 Node.js で Web アプリ を作っている⼈ 他の⾔語からの転⼊⽣ 特に
リクエストごとにプロセスやメモリ空間が 独⽴している世界 からの来訪者(e.g., PHP ) 技術レベル: 中級 ↓スライドはこちら↓ https://speakerdeck.com/shimataro https://shimataro.github.io/slides/
⽬次 ⽬次 最初に リソースの管理⽅法 その1 その2 その3 どうすればいいの? まとめ
それでは始めます それでは始めます
最初に 最初に
リソースとは リソースとは ここで⾔う リソースとは、プログラムが確保・解放 する必要がある メモリ以外の 資源を指す ファイルディスクリプタ コネクション 特に
(R)DB コネクション についてのお話です メモリはGC が回収してくれるので今回の対象外
リソースの管理⽅法 リソースの管理⽅法 DB コネクションをどうやって管理してますか?
1. グローバルオブジェクト 1. グローバルオブジェクト グローバルなリソースを使いまわす const mysql = require("mysql"); //
これを使いまわす const connection = mysql.createConnection(...);
1. グローバルオブジェクト 1. グローバルオブジェクト 利点 リソースは最⼩限 毎回確保する必要がないので⾼速 ⽋点 切断時の再接続処理が必要 瞬断
MySQL では8 時間アイドル状態だと切断される トランザクションが他のリクエストを巻き込む 開発時は気づきにくい
2. 都度確保・都度解放 2. 都度確保・都度解放 必要なときに確保、不要になったら解放 const mysql = require("mysql"); const
pool = mysql.createPool(...); function someFunc() { try { const connection = pool.getConnection(); // 必要になったら確保 ... // 何か処理 } finally { connection.release(); // 使い終わったら解放 } }
2. 都度確保・都度解放 2. 都度確保・都度解放 利点 リクエスト間のトランザクションは独⽴する ⽋点 1 リクエスト中に 無駄に
リソースを2 つ以上作成す る場合あり(関数のネスト等)
3. リクエスト内で使いまわす 3. リクエスト内で使いまわす リクエストオブジェクトにリソースを関連付け、この リソースを使いまわす (もしくはContinuation Local Storage を使⽤)
const mysql = require("mysql"); const pool = mysql.createPool(...); function getConnection(req) { if(req.connection === undefined) { // req にリソースを関連付ける req.connection = pool.getConnection(); } return req.connection; }
3. リクエスト内で使いまわす 3. リクエスト内で使いまわす 利点 1 コネクション/ リクエスト 以下 ⽋点
解放忘れに注意 リクエスト処理の最後 で解放を忘れると…
3. リクエスト内で使いまわす 3. リクエスト内で使いまわす こうなります (転⼊⽣がハマる罠)
3. リクエスト内で使いまわす 3. リクエスト内で使いまわす 転⼊⽣のハマりどころ リクエストを捌き終えても プロセスは⾛り続ける 強制解放されない PHP とは違うのだよ
デストラクタ/ ファイナライザがない GC でメモリは回収されるが、 それ以外のリソー スは回収されない
どうすればいいの? どうすればいいの? しばらく悩みました。 正常終了・異常終了で ⾶ぶイベントが異なる F5 連打されると イベントが⾶ばない (ことがあ る)
リソース取得⾃体が⾮同期だとさらにややこしい
こうしとけ こうしとけ 3 箇所で解放 特に最後は⼤事(F5 連打対策) function middleware(req, res, next)
{ // Express.js のミドルウェア req.connection = ...; res .on("finish", () => { req.connection.release(); // 正常完了時 }) .on("close", () => { req.connection.release(); // 異常終了時(通信切断) }); if (res.socket.destroyed) { // すでに通信が切断されていた(イベントが発⽣しない) req.connection.release(); } }
簡単な⽅法 簡単な⽅法 on-finished パッケージを使うと楽 https://www.npmjs.com/package/on- nished const onFinished = require("on-finished");
function middleware(req, res, next) { // Express.js のミドルウェア req.connection = ...; onFinished(res, () => { req.connection.release(); // ここで解放するだけ! }); }
ちなみに… ちなみに… グローバルオブジェクトを使いまわす場合は 切断時にしっかり再接続して トランザクション時に新しくリソースを作る うまくやってくれるORM を使おう (e.g., Sequelize )
でも、処理完了のタイミングを知っておくのも役に⽴ ちます
まとめ まとめ リソース管理には注意しよう 他の⾔語から来た⼈は特に注意 処理完了の検知は 3 箇所 で! パッケージ を使うと楽だよ
ORM を使うともっと楽だよ うどん が好きな⼈は声をかけてね!
おまけ おまけ
関⻄でもNODE 学園! 関⻄でもNODE 学園! 東⻄で盛り上げていきましょう! 関⻄Node 学園 梅⽥キャンパス 1 時限⽬(04/20
) 関⻄Node 学園 梅⽥キャンパス 2 時限⽬(07/05 ) 関⻄Node 学園 3 時限⽬(08/03 ) 関⻄Node 学園 4 時限⽬(11/02 )
ありがとうございました ありがとうございました