コアデータバックグラウンド処理

ジョブキュー

ワーカーが停止してもジョブを失わないFIFOキュー。プロデューサーとコンシューマーは並列に動作します。

LPUSH/s(パイプライン、実測)
31.6M
クラッシュで失うジョブ
0
ポーリング
0
ステップ 1 / 5
プロデューサーがジョブを追加

どのサービスも、コンシューマーを待たずに仕事を追加できます。

サンプルセッションplaying
# プロデューサーがジョブを追加
hotkv> LPUSH queue:emails "{\"to\":\"ada@example.com\",\"tpl\":\"welcome\"}"
(integer) 18

実際のHotKVコマンドと応答例を使ったアニメーションのウォークスルーです。任意のステップをクリックすると、そこに移動します。 コマンドと応答は、HotKVで実際に入力し表示されるとおり英語のままです。

課題

メール、画像のリサイズ、Webhookといったバックグラウンド処理には、仕事を作るコードと実行するコードの間にキューが必要です。ワーカーがタスクの途中でクラッシュしたときにジョブを失うキューは、キューがないよりも悪い状態です。ジョブが消えたことに誰も気づかないからです。

HotKVでの解決方法

リストを使えば、シンプルなFIFOキューになります。BLMOVEは各ジョブをワーカーに渡す際に処理中リストへ移すため、そのワーカーが消えても、処理中のジョブは必ずどこかに保存されています。プロデューサーとコンシューマーは、並列のワーカースレッドで処理されます。

ステップごとに

コマンドごとに何が起きるか

  1. 01

    プロデューサーがジョブを追加

    どのサービスも、コンシューマーを待たずに仕事を追加できます。

    LPUSH queue:emails "{\"to\":\"ada@example.com\",\"tpl\":\"welcome\"}"
  2. 02

    ワーカーが安全にジョブを取得

    BLMOVEはジョブが届くまでブロックし、届いたら1ステップで処理中リストに移します。

    BLMOVE queue:emails queue:emails:processing RIGHT LEFT 0
  3. 03

    完了したら確認応答

    メールが送信されました。ジョブは処理中リストから削除されます。

    LREM queue:emails:processing 1 "{\"to\":\"ada@example.com\",\"tpl\":\"welcome\"}"
  4. 04

    ワーカーがクラッシュ

    ワーカー2がジョブの途中で停止します。そのジョブは処理中リストに残っており、失われていません。

    LRANGE queue:emails:processing 0 -1
  5. 05

    再登録して続行

    モニターが放棄されたジョブをキューに戻し、別のワーカーがそれを取得します。

    LMOVE queue:emails:processing queue:emails LEFT RIGHT
活用シーン

実際のシナリオ

トランザクションメールとSMS

登録、領収書、リセットのメッセージはWebアプリがキューに入れ、ワーカーのプールが送信します。

メディア処理

アップロードはサムネイル作成とトランスコードのためにキューに入り、トランスコーダーがクラッシュしてもファイルが失われることはありません。

Webhookの配信

送信するWebhookはキューに入れて再試行されるため、それを発生させたリクエストをブロックしません。

標準搭載

得られるもの

ブロッキング読み取り付きのFIFO

LPUSHとBRPOPを使い、ワーカーは仕事が届くまでスリープします。

LPUSHBRPOP

ジョブを失わない

BLMOVEが各ジョブをアトミックに処理中リストへ渡します。

BLMOVELREM

並列のプロデューサーとコンシューマー

プロデューサーとコンシューマーは、並列のワーカースレッドで処理されます。

さらに必要なら

確認応答、コンシューマーグループ、リプレイが必要な場合はストリームを使います。

XADDXREADGROUP
リファレンス:BLMOVEBRPOPLPUSHLMOVE

よくある質問

ワーカーがクラッシュしたらジョブはどうなりますか?

BLMOVEでジョブを取得していれば、ジョブは処理中リストに残ります。モニターが、そこに長く残りすぎているものをキューに戻せます。

ワーカーはポーリングする必要がありますか?

いいえ。BRPOPとBLMOVEは、ジョブが届くまでブロックします。タイムアウトも設定できます。

リストとストリームのどちらを使うべきですか?

リストは最もシンプルなキューです。ストリームは、コンシューマーグループ、メッセージごとの確認応答、履歴を追加します。イベントストリーミングのユースケースをご覧ください。

関連するユースケース

ご自身のワークロードで試してみましょう

HotKVはRedisプロトコルに対応しているため、既存のクライアントを向けるだけで、これらと同じコマンドを実行できます。