Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
@nestjs/bull の活用について NestJS meetup Online #4 @odan3240
Slide 2
Slide 2 text
目次 ● 自己紹介 ● 今日話すこと ● @nestjs/bull とは ● API と Worker のサーバを分ける ● ログに共通の ID を仕込む ● bull の各種イベントをログに出力する 2
Slide 3
Slide 3 text
今日話すこと ● バックエンドの非同期処理に @nestjs/bull を使用 ● サービス運用で便利になる テクニックをいくつかご紹介 ● サンプルコード ○ odan-sandbox/nestjs-bull-patterns-sandbox ● 前提知識 ○ AWS Fargate にバックエンドのサーバがある ○ ログの集計は CloudWatch 3
Slide 4
Slide 4 text
@nestjs/bull とは 4
Slide 5
Slide 5 text
@nestjs/bull とは ● https://github.com/OptimalBits/bull は Redis バックエンドの非同期キューのライブラリ 5
Slide 6
Slide 6 text
@nestjs/bull とは ● @nestjs/bull は bull の NestJS 向けのラッパー ● bull の Queue の仕組みを NestJS way な方法で扱える 6
Slide 7
Slide 7 text
@nestjs/bull とは ● @nestjs/bull は bull の NestJS 向けのラッパー ● bull の Queue の仕組みを NestJS way な方法で扱える 7
Slide 8
Slide 8 text
API と Worker のサーバを分ける 8
Slide 9
Slide 9 text
API と Worker のサーバを分ける ● API と Worker のサーバは求められる インフラの要件が異なる ○ 水平スケールの条件など ● 2つのサーバは独立で動くように プロセスを分けるのが良さそう ● 「nestjs bull separate process」でググると Stack Overflow でヒットする 9
Slide 10
Slide 10 text
API と Worker のサーバを分ける 10 WebhookProcessor の登録の有無
Slide 11
Slide 11 text
API と Worker のサーバを分ける ● registerQueueAsync ○ queue.add を使うモジュールに登録する ○ API サーバで呼び出されるモジュールなど ● registerProcessorAsync ○ 登録された job を実行するための関数 ○ worker 用のプロセスを起動するモジュールに登録する 11
Slide 12
Slide 12 text
API と Worker のサーバを分ける 12 worker の実行
Slide 13
Slide 13 text
API と Worker のサーバを分ける ● app.init() を実行すると アプリケーションが開始 ● queue に job が追加されると processor が実行されるようになる ● ファイルは worker.ts で API サーバのエントリーファイル (main.ts) とは別 ○ 別のプロセスで実行 ○ コンテナを分けることも可能 13
Slide 14
Slide 14 text
ログに共通の ID を仕込む 14
Slide 15
Slide 15 text
ログに共通の ID を仕込む ● pino-http は express 向けのロガーライブラリ ● jsonl ベースのログを出力する 15
Slide 16
Slide 16 text
ログに共通の ID を仕込む ● nestjs-pino は pino-http の NestJS 向けラッパー 16
Slide 17
Slide 17 text
ログに共通の ID を仕込む ● リクエストごとに共通の ID が割り振られていると 障害発生時の原因調査が楽 ○ Observability の向上 ● ID で filter するとリクエストを受け付けてから レスポンスを返すまでの流れを把握できる ○ 外部 API の呼び出しのログ ○ クエリ発行のログ 17
Slide 18
Slide 18 text
ログに共通の ID を仕込む ● worker でも pino-http みたいなことがしたい ● worker の処理が開始してから終了するまでに どういうログが出力されたか追跡可能だと良い 18
Slide 19
Slide 19 text
ログに共通の ID を仕込む 19 AsyncLocalStorage を使う
Slide 20
Slide 20 text
ログに共通の ID を仕込む 20 BaseProcessor を継承するだけ
Slide 21
Slide 21 text
bull の各種イベントをログに出力する 21
Slide 22
Slide 22 text
bull の各種イベントをログに出力する ● bull は queue に入った job の状態に 応じて様々なイベントを emit する 22
Slide 23
Slide 23 text
bull の各種イベントをログに出力する ● OnQueueError ○ job がエラーになったとき ● OnQueueActive ○ job がアクティブになったとき ● OnQueueCompleted ○ job が完了したとき ● OnQueueFailed ○ job が失敗したとき ● これらのイベントのタイミングでログを 出力しておくと障害発生時に調査が楽になる 23
Slide 24
Slide 24 text
bull の各種イベントをログに出力する 24 イベントに対してログを出す
Slide 25
Slide 25 text
まとめ 25
Slide 26
Slide 26 text
まとめ ● 運用を楽にする @nestjs/bull の使い方を紹介 ○ API と Worker のサーバを分ける ○ ログに共通の ID を仕込む ○ bull の各種イベントをログに出力する ● いわゆる Observability を改善すると 障害発生時の原因調査が楽 26