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
0
940
cls-hooked による実行コンテキストの保存と利用
NestJS meetup #5
Hiroaki KARASAWA
March 31, 2023
Tweet
Share
More Decks by Hiroaki KARASAWA
See All by Hiroaki KARASAWA
スタートアップでポストモーテムを4年で200回やって得た学び
karszawa
0
69
DomainException と Result 型で作る型安全なエラーハンドリング
karszawa
0
1.3k
成功する技術選定について
karszawa
2
2.8k
飲食店のインフラサービス “ダイニー” のトラブル対応のすべて
karszawa
0
73
Google Cloud のモニタリング製品を徹底活用してみた
karszawa
0
64
ダウンタイム 30 秒で AlloyDB に移行した話
karszawa
0
520
DMS で AlloyDB に簡単移行!
karszawa
0
66
【現場の本音】App Engine から Cloud Run に移行してみた
karszawa
0
180
Hasura の Relationship と権限管理
karszawa
0
990
Other Decks in Programming
See All in Programming
MCPでVibe Working。そして、結局はContext Eng(略)/ Working with Vibe on MCP And Context Eng
rkaga
5
2.2k
ぬるぬる動かせ! Riveでアニメーション実装🐾
kno3a87
1
190
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
0
360
意外と簡単!?フロントエンドでパスキー認証を実現する WebAuthn
teamlab
PRO
2
690
AI時代のUIはどこへ行く?
yusukebe
16
8.6k
Protocol Buffersの型を超えて拡張性を得る / Beyond Protocol Buffers Types Achieving Extensibility
linyows
0
110
プロパティベーステストによるUIテスト: LLMによるプロパティ定義生成でエッジケースを捉える
tetta_pdnt
0
250
為你自己學 Python - 冷知識篇
eddie
1
340
デザイナーが Androidエンジニアに 挑戦してみた
874wokiite
0
250
Go言語での実装を通して学ぶLLMファインチューニングの仕組み / fukuokago22-llm-peft
monochromegane
0
120
【第4回】関東Kaggler会「Kaggleは執筆に役立つ」
mipypf
0
1.1k
旅行プランAIエージェント開発の裏側
ippo012
2
880
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
Making Projects Easy
brettharned
117
6.4k
How GitHub (no longer) Works
holman
315
140k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.5k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
19k
Statistics for Hackers
jakevdp
799
220k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
A Modern Web Designer's Workflow
chriscoyier
696
190k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Practical Orchestrator
shlominoach
190
11k
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 行ぐらいしかないライブラリなので読んでみて下さい