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