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