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
760
cls-hooked による実行コンテキストの保存と利用
NestJS meetup #5
Hiroaki KARASAWA
March 31, 2023
Tweet
Share
More Decks by Hiroaki KARASAWA
See All by Hiroaki KARASAWA
成功する技術選定について
karszawa
2
1.3k
飲食店のインフラサービス “ダイニー” のトラブル対応のすべて
karszawa
0
7
Google Cloud のモニタリング製品を徹底活用してみた
karszawa
0
30
ダウンタイム 30 秒で AlloyDB に移行した話
karszawa
0
82
DMS で AlloyDB に簡単移行!
karszawa
0
31
【現場の本音】App Engine から Cloud Run に移行してみた
karszawa
0
130
Hasura の Relationship と権限管理
karszawa
0
790
React Native + Expo のバージョンアップと互換性の維持に関する運用と絶技
karszawa
0
740
ダイニーにおけるモニタリングと振り返りの仕組み
karszawa
1
240
Other Decks in Programming
See All in Programming
短期間での新規プロダクト開発における「コスパの良い」Goのテスト戦略」 / kamakura.go
n3xem
2
170
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
270
menu基盤チームによるGoogle Cloudの活用事例~Application Integration, Cloud Tasks編~
yoshifumi_ishikura
0
110
良いユニットテストを書こう
mototakatsu
8
2.9k
PHPUnitしか使ってこなかった 一般PHPerがPestに乗り換えた実録
mashirou1234
0
240
数十万行のプロジェクトを Scala 2から3に完全移行した
xuwei_k
0
280
「とりあえず動く」コードはよい、「読みやすい」コードはもっとよい / Code that 'just works' is good, but code that is 'readable' is even better.
mkmk884
3
540
Mermaid x AST x 生成AI = コードとドキュメントの完全同期への道
shibuyamizuho
0
160
テストコード書いてみませんか?
onopon
2
150
週次リリースを実現するための グローバルアプリ開発
tera_ny
1
100
Recoilを剥がしている話
kirik
5
6.9k
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
420
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Automating Front-end Workflow
addyosmani
1366
200k
Raft: Consensus for Rubyists
vanstee
137
6.7k
Become a Pro
speakerdeck
PRO
26
5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
It's Worth the Effort
3n
183
28k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
247
1.3M
Navigating Team Friction
lara
183
15k
Faster Mobile Websites
deanohume
305
30k
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 行ぐらいしかないライブラリなので読んでみて下さい