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
cls-hooked による実行コンテキストの保存と利用
Search
Hiroaki KARASAWA
March 31, 2023
Programming
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
cls-hooked による実行コンテキストの保存と利用
NestJS meetup #5
Hiroaki KARASAWA
March 31, 2023
More Decks by Hiroaki KARASAWA
See All by Hiroaki KARASAWA
スタートアップでポストモーテムを4年で200回やって得た学び
karszawa
1
160
DomainException と Result 型で作る型安全なエラーハンドリング
karszawa
1
1.6k
成功する技術選定について
karszawa
2
3.3k
飲食店のインフラサービス “ダイニー” のトラブル対応のすべて
karszawa
0
170
Google Cloud のモニタリング製品を徹底活用してみた
karszawa
0
120
ダウンタイム 30 秒で AlloyDB に移行した話
karszawa
0
590
DMS で AlloyDB に簡単移行!
karszawa
0
130
【現場の本音】App Engine から Cloud Run に移行してみた
karszawa
0
250
Hasura の Relationship と権限管理
karszawa
0
1.1k
Other Decks in Programming
See All in Programming
「つくるAI」だけではバグは見つからない ~テストに必要な「見つけるAI」を分離させる戦略~
mfunaki
0
230
iOS開発×AI駆動開発 〜最近使って便利だったスキルの話〜
nogu66
0
140
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
54
36k
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
440
私のClaude Code活用法 (個人開発編) - PHPerKaigi mini #4(2026/08/24)
panda_program
1
210
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
160
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
420
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.5k
Building an Out-of-Order CPU
latte72
0
700
スマート反転とウェブアクセシビリティ
camiha
0
120
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
2
500
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
470
Featured
See All Featured
First, design no harm
axbom
PRO
2
1.3k
BBQ
matthewcrist
89
10k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Claude Code のすすめ
schroneko
67
230k
Odyssey Design
rkendrick25
PRO
2
800
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
520
The Curse of the Amulet
leimatthew05
2
14k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
310
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
770
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
520
Docker and Python
trallard
47
4.2k
Transcript
cls-hooked による実行コンテキストの保存と利用 Hiroaki KARASAWA from dinii, inc NestJS meetup online
#5 2023/03/31
2 自己紹介 • 氏名 ◦ 唐澤弘明 or @karszawa • 所属
◦ 株式会社 dinii ◦ 飲食店の POS システムやモバイルオーダーを作っています ◦ 【顧客情報 x 喫食情報】で飲食業界で初めて CRM を実現しています • 興味 ◦ TypeScript, React, GraphQL ◦ NestJS 歴 ⇒ 3年(ダイニーに入社してから)
飲食店の All in One SaaS “ダイニー”
dinii と NestJS 4 • ダイニーのバックエンドは NestJS によるモノリスです ◦ 最近
Modular Monolith っぽく分割し始めた ユーザー数【450万人】到達! 🎉🎉🎉
【本題】 ダイニーにおける cls-hooked の活用 5
cls-hooked is … 6 Continuation-Local Storage ( Hooked ) •
Async hooks の便利なラッパー Async hooks is … • Node.js の API で非同期処理のライフサイクルを追跡できる 🤨 • その関数がどういうコンテキストで呼び出されたかを記録できる 🤔 • 関数の呼び出しごとに呼び出しの粒度で情報を保持できる 🧐
関数の呼び出しごとに呼び出しの粒度で情報を保持できる 7 例 • Async hooks を使わないならこんな感じ • もちろん main
がたくさん呼び出されると上手く行かない
cls-hooked を利用するとこうなる 8 例 `context` が cls-hooked によって作成されている
便利ですよね? 9
ダイニーでの活用例を紹介します 10
実用例 ① リクエストごとの id を保存してロガーで出力 11 ヘッダーから x-request-id を抽出 事前に定義した
context にセット context を作成(グローバルで OK) AppModule にて利用 ※ Express.js の app.use と同じ NestMiddleware として実装できる
実用例 ① リクエストごとの id を保存してロガーで出力 12 先程の context から値を取得 logger
で出力 ※ ちなみに winston を使っています ※ ちなみに winston の出力先はこんな感じ 開発環境 ⇒ Human readable format 本番環境 ⇒ JSON で標準出力 + Sentry
実用例 ② NestJS x TypeORM 13 データベースのトランザクションか否かのコンテキストを保存してトランザクション中での利用であればトランザクション用のコ ネクションを利用する • その関数がトランザクション内で実行されていれば失敗時はロールバックして欲しい
• トランザクションではないなら不要な処理はしないで欲しい • それぞれ書き分けるのは面倒くさい というときありませんか?
実用例 ② トランザクションのコンテキスト 14 odavid/typeorm-transactional-cls-hooked というライブラリの実装にて cls-hooked が活用されています
実用例 ② トランザクションのコンテキスト 15 おもむろに runOnTransactionalCommit という関数を 呼び出すとトランザクションコミット時に処理を実行してくれ る (これも呼び出しのコンテキストをストレージとして利用して
いる)
実用例 ② トランザクションのコンテキスト 16 NestJS での TypeORM の実践に関してはこちらの記事もご覧ください!
実用例 ③ Transactional を魔改造 17 OLAP 的なメソッドにおいてリードレプリカの利用を強制する • 重い分析系のクエリを間違ってもプライマリのデータベースに向けたくない •
あるメソッド以下では絶対に特定のコネクション(レプリカ向け)を利用させる
実用例 ③ Transactional を魔改造 18 デフォルトのデータソース レプリカのデータソース Analytical のアノテーションが付いているかどうかを cls-hooked
で保持し、付いていればレプリカの方の DataSource を使うよう Repository にパッチをあてる
まとめ 19
まとめ 20 • cls-hooked について説明しました • アイデア次第でいろいろなことができる • 実現不可能と思っていた難しい課題があっさり解決してしまうことも •
実は 500 行ぐらいしかないライブラリなので読んでみて下さい