核心数据后台任务

任务队列

即使 worker 崩溃也不会丢失任务的 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 等后台工作,需要在产生工作的代码和执行工作的代码之间放一个队列。如果 worker 在任务中途崩溃时队列会丢失任务,那还不如没有队列,因为没人会发现任务不见了。

HotKV 如何解决

list 提供了简单的 FIFO 队列。BLMOVE 在把每个任务交给 worker 的同时将其移到处理列表中,因此即使该 worker 消失,进行中的任务也始终存放在某处。生产者和消费者由并行的 worker 线程提供服务。

逐步演示

逐条命令,看看发生了什么

  1. 01

    生产者推送任务

    任何服务都可以添加工作,无需等待消费者。

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

    worker 安全地认领任务

    BLMOVE 阻塞直到有任务可用,然后一步将其移到处理列表。

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

    完成后确认

    邮件已发出。任务从处理列表中移除。

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

    一个 worker 崩溃

    Worker 2 在任务中途宕机。它的任务仍在处理列表中,没有丢失。

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

    重新入队并继续

    监控程序把被遗弃的任务移回队列,由另一个 worker 接手。

    LMOVE queue:emails:processing queue:emails LEFT RIGHT
适用场景

真实场景

事务性邮件与短信

注册、收据和重置消息由 Web 应用放入队列,再由一组 worker 发送。

媒体处理

上传的文件排队等待生成缩略图和转码,转码程序崩溃也绝不会丢掉文件。

Webhook 投递

外发的 webhook 被放入队列并重试,不会阻塞触发它们的请求。

内置功能

您将获得

带阻塞读取的 FIFO

LPUSH 配合 BRPOP,worker 在工作到来之前一直休眠。

LPUSHBRPOP

任务不丢失

BLMOVE 以原子方式把每个任务交给处理列表。

BLMOVELREM

并行的生产者和消费者

生产者和消费者由并行的 worker 线程提供服务。

需要更多功能?

如需确认机制、消费者组和重放,请使用流。

XADDXREADGROUP

常见问题

worker 崩溃时任务会怎样?

如果您用 BLMOVE 认领任务,任务会留在处理列表中。监控程序可以把停留过久的任务移回队列。

worker 需要轮询吗?

不需要。BRPOP 和 BLMOVE 会阻塞直到任务到来,可选设置超时。

用 list 还是流?

list 是最简单的队列。流增加了消费者组、逐条消息确认和历史记录。请参阅事件流用例。

相关用例

在您自己的工作负载上试试

HotKV 兼容 Redis 协议,您可以把现有客户端指向它,运行这些相同的命令。