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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
Tebiki Engineering Team Deck
tebiki
0
24k
Webhook best practices for rock solid and resilient deployments
glaforge
1
290
AWS Network Firewall Proxyを触ってみた
nagisa53
1
220
OCI Database Management サービス詳細
oracle4engineer
PRO
1
7.4k
AIエージェントを開発しよう!-AgentCore活用の勘所-
yukiogawa
0
160
変化するコーディングエージェントとの現実的な付き合い方 〜Cursor安定択説と、ツールに依存しない「資産」〜
empitsu
4
1.4k
広告の効果検証を題材にした因果推論の精度検証について
zozotech
PRO
0
170
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
3k
超初心者からでも大丈夫!オープンソース半導体の楽しみ方〜今こそ!オレオレチップをつくろう〜
keropiyo
0
110
ClickHouseはどのように大規模データを活用したAIエージェントを全社展開しているのか
mikimatsumoto
0
230
データの整合性を保ちたいだけなんだ
shoheimitani
8
3.1k
予期せぬコストの急増を障害のように扱う――「コスト版ポストモーテム」の導入とその後の改善
muziyoshiz
1
1.8k
Featured
See All Featured
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
290
My Coaching Mixtape
mlcsv
0
48
BBQ
matthewcrist
89
10k
Abbi's Birthday
coloredviolet
1
4.7k
Six Lessons from altMBA
skipperchong
29
4.1k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
180
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
140
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
730
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
180
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
71k
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 )
ありがとうございました ありがとうございました