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
890
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
16
DomainException と Result 型で作る型安全なエラーハンドリング
karszawa
0
1.1k
成功する技術選定について
karszawa
2
2.6k
飲食店のインフラサービス “ダイニー” のトラブル対応のすべて
karszawa
0
53
Google Cloud のモニタリング製品を徹底活用してみた
karszawa
0
53
ダウンタイム 30 秒で AlloyDB に移行した話
karszawa
0
490
DMS で AlloyDB に簡単移行!
karszawa
0
58
【現場の本音】App Engine から Cloud Run に移行してみた
karszawa
0
160
Hasura の Relationship と権限管理
karszawa
0
940
Other Decks in Programming
See All in Programming
推論された型の移植性エラーTS2742に挑む
teamlab
PRO
0
120
データと事例で振り返るDevin導入の"リアル" / The Realities of Devin Reflected in Data and Case Studies
rkaga
3
3.3k
TypeScriptのmoduleオプションを改めて整理する
bicstone
4
380
Storybookの情報をMCPサーバー化する
shota_tech
3
1.6k
がんばりすぎないコーディングルール運用術
tsukakei
1
110
#QiitaBash TDDでAIに設計イメージを伝える
ryosukedtomita
2
1.1k
TypeScript製IaCツールのAWS CDKが様々な言語で実装できる理由 ~他言語変換の仕組み~ / cdk-language-transformation
gotok365
6
340
Investigating Multithreaded PostgreSQL
macdice
0
130
技術的負債と戦略的に戦わざるを得ない場合のオブザーバビリティ活用術 / Leveraging Observability When Strategically Dealing with Technical Debt
yoshiyoshifujii
0
150
少数精鋭エンジニアがフルスタック力を磨く理由 -そしてAI時代へ-
rebase_engineering
0
100
コードに語らせよう――自己ドキュメント化が内包する楽しさについて / Let the Code Speak
nrslib
4
500
Rethinking Data Access: The New httpResource in Angular
manfredsteyer
PRO
0
190
Featured
See All Featured
Speed Design
sergeychernyshev
30
960
The Straight Up "How To Draw Better" Workshop
denniskardys
233
140k
How to train your dragon (web standard)
notwaldorf
92
6k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
48
5.4k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
5
600
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.5k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.6k
Six Lessons from altMBA
skipperchong
28
3.8k
How to Think Like a Performance Engineer
csswizardry
23
1.6k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Optimising Largest Contentful Paint
csswizardry
37
3.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 行ぐらいしかないライブラリなので読んでみて下さい