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

@nestjs/bull の活用について

odanado
September 30, 2022

@nestjs/bull の活用について

odanado

September 30, 2022
Tweet

More Decks by odanado

Other Decks in Programming

Transcript

  1. @nestjs/bull の活用について

    NestJS meetup Online #4

    @odan3240


    View full-size slide

  2. 目次

    ● 自己紹介

    ● 今日話すこと

    ● @nestjs/bull とは

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

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

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

    2


    View full-size slide

  3. 今日話すこと

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

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

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

    ● サンプルコード

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


    ● 前提知識

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

    ○ ログの集計は CloudWatch

    3


    View full-size slide

  4. @nestjs/bull とは

    4


    View full-size slide

  5. @nestjs/bull とは

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

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

    5


    View full-size slide

  6. @nestjs/bull とは

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

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

    6


    View full-size slide

  7. @nestjs/bull とは

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

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

    7


    View full-size slide

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

    8


    View full-size slide

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

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

    インフラの要件が異なる

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

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

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


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

    9


    View full-size slide

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

    10

    WebhookProcessor の登録の有無


    View full-size slide

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

    ● registerQueueAsync

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

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


    ● registerProcessorAsync

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

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

    11


    View full-size slide

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

    12

    worker の実行


    View full-size slide

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

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

    アプリケーションが開始

    ● queue に job が追加されると

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


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

    ○ 別のプロセスで実行

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

    13


    View full-size slide

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

    14


    View full-size slide

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

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

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

    15


    View full-size slide

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

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

    16


    View full-size slide

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

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

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

    ○ Observability の向上


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

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

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

    ○ クエリ発行のログ

    17


    View full-size slide

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

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


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

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


    18


    View full-size slide

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

    19

    AsyncLocalStorage を使う


    View full-size slide

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

    20

    BaseProcessor を継承するだけ


    View full-size slide

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

    21


    View full-size slide

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

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

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

    22


    View full-size slide

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

    ● OnQueueError

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

    ● OnQueueActive

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

    ● OnQueueCompleted

    ○ job が完了したとき

    ● OnQueueFailed

    ○ job が失敗したとき


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

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


    View full-size slide

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

    24

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


    View full-size slide

  25. まとめ

    25


    View full-size slide

  26. まとめ

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

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

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

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


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

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

    26


    View full-size slide