Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
おまいらちゃんとリソース解放してますか / Remember to close resources!
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
shimataro
November 23, 2018
Technology
1.3k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
おまいらちゃんとリソース解放してますか / Remember to close resources!
東京Node学園祭2018の発表資料です
https://nodefest.jp/2018/
shimataro
November 23, 2018
More Decks by shimataro
See All by shimataro
作って理解するPromise / Let's try implementing Promise
shimataro
0
65
Single Executable Applicationsについて / About Single Executable Applications
shimataro
0
2.1k
パッケージ開発者の苦悩 -JavaScriptランタイム群雄割拠- / distress of package developer
shimataro
0
900
An introduction to Node.js
shimataro
0
330
KFDのススメ / About KFD
shimataro
3
880
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
860
BigInt あれこれ / overview about BigInt
shimataro
0
1k
dynamic import あれこれ / dynamic import - overview and pitfalls
shimataro
1
900
Other Decks in Technology
See All in Technology
12 個 Tool と、 4,096 Token
hlum
0
110
スキルを作る、その前に!複数人で使われるスキルを 作るためのプロセス
junkifurukawa
2
370
並行性の問題を防げ!実践トランザクション入門
occhi
0
280
ビジネスを止めない技術的負債の返済のための戦略とその手法 - 技術的負債と向き合う / Complexity and Simplicity
soudai
PRO
3
680
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
2
320
USB PDを使ってスマホを労わりたい
raspython3
0
120
今こそ知りたいAmplifyGen2
mkdev10
2
160
AI駆動開発、viviONの1年 ── うまくいったこと・いかなかったこと
vivion
0
280
脆弱性診断って、何をしているの? 〜弱点を見つけて、会社の改善につなげるまで〜
keeg
0
790
go-sqletch
moznion
0
130
無理せず続ける、子育てエンジニアの学び
codmoninc
PRO
0
560
カンファレンスに参加した後の浮遊感とセルフケア
pauli
0
320
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
560
The Language of Interfaces
destraynor
162
27k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
980
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
490
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
530
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
920
Exploring anti-patterns in Rails
aemeredith
4
530
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
270
Building Adaptive Systems
keathley
44
3.2k
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 )
ありがとうございました ありがとうございました