Upgrade to Pro — share decks privately, control downloads, hide ads and more …

@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


    View Slide

  2. 目次

    ● 自己紹介

    ● 今日話すこと

    ● @nestjs/bull とは

    ● API と Worker のサーバを分ける

    ● ログに共通の ID を仕込む

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

    2


    View Slide

  3. 今日話すこと

    ● バックエンドの非同期処理に @nestjs/bull を使用

    ● サービス運用で便利になる

    テクニックをいくつかご紹介

    ● サンプルコード

    ○ odan-sandbox/nestjs-bull-patterns-sandbox


    ● 前提知識

    ○ AWS Fargate にバックエンドのサーバがある

    ○ ログの集計は CloudWatch

    3


    View Slide

  4. @nestjs/bull とは

    4


    View Slide

  5. @nestjs/bull とは

    ● https://github.com/OptimalBits/bull は

    Redis バックエンドの非同期キューのライブラリ

    5


    View Slide

  6. @nestjs/bull とは

    ● @nestjs/bull は bull の NestJS 向けのラッパー

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

    6


    View Slide

  7. @nestjs/bull とは

    ● @nestjs/bull は bull の NestJS 向けのラッパー

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

    7


    View Slide

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

    8


    View Slide

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

    ● API と Worker のサーバは求められる

    インフラの要件が異なる

    ○ 水平スケールの条件など

    ● 2つのサーバは独立で動くように

    プロセスを分けるのが良さそう


    ● 「nestjs bull separate process」でググると Stack
    Overflow でヒットする

    9


    View Slide

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

    10

    WebhookProcessor の登録の有無


    View Slide

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

    ● registerQueueAsync

    ○ queue.add を使うモジュールに登録する

    ○ API サーバで呼び出されるモジュールなど


    ● registerProcessorAsync

    ○ 登録された job を実行するための関数

    ○ worker 用のプロセスを起動するモジュールに登録する

    11


    View Slide

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

    12

    worker の実行


    View Slide

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

    ● app.init() を実行すると

    アプリケーションが開始

    ● queue に job が追加されると

    processor が実行されるようになる


    ● ファイルは worker.ts で API サーバのエントリーファイル
    (main.ts) とは別

    ○ 別のプロセスで実行

    ○ コンテナを分けることも可能

    13


    View Slide

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

    14


    View Slide

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

    ● pino-http は express 向けのロガーライブラリ

    ● jsonl ベースのログを出力する

    15


    View Slide

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

    ● nestjs-pino は pino-http の NestJS 向けラッパー

    16


    View Slide

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

    ● リクエストごとに共通の ID が割り振られていると

    障害発生時の原因調査が楽

    ○ Observability の向上


    ● ID で filter するとリクエストを受け付けてから

    レスポンスを返すまでの流れを把握できる

    ○ 外部 API の呼び出しのログ

    ○ クエリ発行のログ

    17


    View Slide

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

    ● worker でも pino-http みたいなことがしたい


    ● worker の処理が開始してから終了するまでに

    どういうログが出力されたか追跡可能だと良い


    18


    View Slide

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

    19

    AsyncLocalStorage を使う


    View Slide

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

    20

    BaseProcessor を継承するだけ


    View Slide

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

    21


    View Slide

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

    ● bull は queue に入った job の状態に

    応じて様々なイベントを emit する

    22


    View Slide

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

    ● OnQueueError

    ○ job がエラーになったとき

    ● OnQueueActive

    ○ job がアクティブになったとき

    ● OnQueueCompleted

    ○ job が完了したとき

    ● OnQueueFailed

    ○ job が失敗したとき


    ● これらのイベントのタイミングでログを

    出力しておくと障害発生時に調査が楽になる
 23


    View Slide

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

    24

    イベントに対してログを出す


    View Slide

  25. まとめ

    25


    View Slide

  26. まとめ

    ● 運用を楽にする @nestjs/bull の使い方を紹介

    ○ API と Worker のサーバを分ける

    ○ ログに共通の ID を仕込む

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


    ● いわゆる Observability を改善すると

    障害発生時の原因調査が楽

    26


    View Slide