$30 off During Our Annual Pro Sale. View Details »

@nestjs/bull の活用について

odanado
PRO
September 30, 2022

@nestjs/bull の活用について

odanado
PRO

September 30, 2022
Tweet

More Decks by odanado

Other Decks in Programming

Transcript

  1. @nestjs/bull の活用について
 NestJS meetup Online #4
 @odan3240


  2. 目次
 • 自己紹介
 • 今日話すこと
 • @nestjs/bull とは
 • API

    と Worker のサーバを分ける
 • ログに共通の ID を仕込む
 • bull の各種イベントをログに出力する
 2

  3. 今日話すこと
 • バックエンドの非同期処理に @nestjs/bull を使用
 • サービス運用で便利になる
 テクニックをいくつかご紹介
 • サンプルコード


    ◦ odan-sandbox/nestjs-bull-patterns-sandbox
 
 • 前提知識
 ◦ AWS Fargate にバックエンドのサーバがある
 ◦ ログの集計は CloudWatch
 3

  4. @nestjs/bull とは
 4


  5. @nestjs/bull とは
 • https://github.com/OptimalBits/bull は
 Redis バックエンドの非同期キューのライブラリ
 5


  6. @nestjs/bull とは
 • @nestjs/bull は bull の NestJS 向けのラッパー
 •

    bull の Queue の仕組みを NestJS way な方法で扱える
 6

  7. @nestjs/bull とは
 • @nestjs/bull は bull の NestJS 向けのラッパー
 •

    bull の Queue の仕組みを NestJS way な方法で扱える
 7

  8. API と Worker のサーバを分ける
 8


  9. API と Worker のサーバを分ける
 • API と Worker のサーバは求められる
 インフラの要件が異なる


    ◦ 水平スケールの条件など
 • 2つのサーバは独立で動くように
 プロセスを分けるのが良さそう
 
 • 「nestjs bull separate process」でググると Stack Overflow でヒットする
 9

  10. API と Worker のサーバを分ける
 10
 WebhookProcessor の登録の有無


  11. API と Worker のサーバを分ける
 • registerQueueAsync
 ◦ queue.add を使うモジュールに登録する
 ◦

    API サーバで呼び出されるモジュールなど
 
 • registerProcessorAsync
 ◦ 登録された job を実行するための関数
 ◦ worker 用のプロセスを起動するモジュールに登録する
 11

  12. API と Worker のサーバを分ける
 12
 worker の実行


  13. API と Worker のサーバを分ける
 • app.init() を実行すると
 アプリケーションが開始
 • queue

    に job が追加されると
 processor が実行されるようになる
 
 • ファイルは worker.ts で API サーバのエントリーファイル (main.ts) とは別
 ◦ 別のプロセスで実行
 ◦ コンテナを分けることも可能
 13

  14. ログに共通の ID を仕込む
 14


  15. ログに共通の ID を仕込む
 • pino-http は express 向けのロガーライブラリ
 • jsonl

    ベースのログを出力する
 15

  16. ログに共通の ID を仕込む
 • nestjs-pino は pino-http の NestJS 向けラッパー


    16

  17. ログに共通の ID を仕込む
 • リクエストごとに共通の ID が割り振られていると
 障害発生時の原因調査が楽
 ◦ Observability

    の向上
 
 • ID で filter するとリクエストを受け付けてから
 レスポンスを返すまでの流れを把握できる
 ◦ 外部 API の呼び出しのログ
 ◦ クエリ発行のログ
 17

  18. ログに共通の ID を仕込む
 • worker でも pino-http みたいなことがしたい
 
 •

    worker の処理が開始してから終了するまでに
 どういうログが出力されたか追跡可能だと良い
 
 18

  19. ログに共通の ID を仕込む
 19
 AsyncLocalStorage を使う


  20. ログに共通の ID を仕込む
 20
 BaseProcessor を継承するだけ


  21. bull の各種イベントをログに出力する
 21


  22. bull の各種イベントをログに出力する
 • bull は queue に入った job の状態に
 応じて様々なイベントを

    emit する
 22

  23. bull の各種イベントをログに出力する
 • OnQueueError
 ◦ job がエラーになったとき
 • OnQueueActive
 ◦

    job がアクティブになったとき
 • OnQueueCompleted
 ◦ job が完了したとき
 • OnQueueFailed
 ◦ job が失敗したとき
 
 • これらのイベントのタイミングでログを
 出力しておくと障害発生時に調査が楽になる
 23

  24. bull の各種イベントをログに出力する
 24
 イベントに対してログを出す


  25. まとめ
 25


  26. まとめ
 • 運用を楽にする @nestjs/bull の使い方を紹介
 ◦ API と Worker のサーバを分ける


    ◦ ログに共通の ID を仕込む
 ◦ bull の各種イベントをログに出力する
 
 • いわゆる Observability を改善すると
 障害発生時の原因調査が楽
 26