Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
cls-hooked による実行コンテキストの保存と利用
Search
Hiroaki KARASAWA
March 31, 2023
Programming
0
980
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
1
88
DomainException と Result 型で作る型安全なエラーハンドリング
karszawa
1
1.4k
成功する技術選定について
karszawa
2
2.9k
飲食店のインフラサービス “ダイニー” のトラブル対応のすべて
karszawa
0
90
Google Cloud のモニタリング製品を徹底活用してみた
karszawa
0
76
ダウンタイム 30 秒で AlloyDB に移行した話
karszawa
0
530
DMS で AlloyDB に簡単移行!
karszawa
0
78
【現場の本音】App Engine から Cloud Run に移行してみた
karszawa
0
190
Hasura の Relationship と権限管理
karszawa
0
1k
Other Decks in Programming
See All in Programming
なあ兄弟、 余白の意味を考えてから UI実装してくれ!
ktcryomm
11
11k
Cap'n Webについて
yusukebe
0
130
Integrating WordPress and Symfony
alexandresalome
0
150
Context is King? 〜Verifiability時代とコンテキスト設計 / Beyond "Context is King"
rkaga
9
1.1k
ゲームの物理 剛体編
fadis
0
340
著者と進める!『AIと個人開発したくなったらまずCursorで要件定義だ!』
yasunacoffee
0
130
TypeScriptで設計する 堅牢さとUXを両立した非同期ワークフローの実現
moeka__c
6
3k
FluorTracer / RayTracingCamp11
kugimasa
0
230
Tinkerbellから学ぶ、Podで DHCPをリッスンする手法
tomokon
0
130
AWS CDKの推しポイントN選
akihisaikeda
1
240
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
100
AIの誤りが許されない業務システムにおいて“信頼されるAI” を目指す / building-trusted-ai-systems
yuya4
6
3.2k
Featured
See All Featured
BBQ
matthewcrist
89
9.9k
Building Adaptive Systems
keathley
44
2.9k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.7k
Leading Effective Engineering Teams in the AI Era
addyosmani
8
1.3k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Designing for Performance
lara
610
69k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.3k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
34k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
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 行ぐらいしかないライブラリなので読んでみて下さい