首页 > 解决方案 > BullMQ - 在服务器重启之间持久化作业排队和管理作业

问题描述

任务的小背景——我正在为 Shopify 构建废弃的购物车回收系统。在用户结帐后,Shopify 调用我们的 webhook,并且 webhook 将该请求作为作业排入队列 A 中,延迟 5 分钟。当工作人员开始处理该作业时,它会检查该结帐是否已支付。如果尚未付款,则会向用户发送购物车恢复消息。

我正在使用 Node.js、Express.js、Redis 和 BullMQ 来实现服务器和排队系统。我试图通过 BUllMQ 的基本示例。在网上,找不到一些关于如何在生产级系统中使用它的高级示例。

现在,我被以下这些问题困住了——

  1. 由于 Redis 是内存数据库,我必须将每个传入的作业保存在我的 MongoDB 集合中,最初状态为 PENDING 并侦听完成事件以在数据库中将该状态更改为 COMPLETED。每当我的服务器重新启动时,我都会获取所有处于 PENDING 状态的作业并将它们添加到队列中。这样,即使 Redis 出现故障或重新启动,我们也可以恢复我们的工作。我的问题是 - 在生产级应用程序中做这样的事情有意义吗?,我应该在 MongoDB 中保存工作吗?& 在实施此流程时,我还应该注意哪些其他事项?

  2. 现在,Bull 队列(让我们将其命名为“A”)正在快速服务器中进行初始化。每次服务器重新启动时,队列 A 也会被初始化。我的问题是 - 是否重新初始化队列 A,删除 Redis 上的旧队列 A?围绕这个问题我还能做些什么?

对于这方面的任何帮助,我将不胜感激。

标签: node.jsredisshopify-appbullmq

解决方案


让我给你一些问题的答案:

由于 Redis 是内存数据库,我必须将每个传入的作业保存在我的 MongoDB 集合中,最初状态为 PENDING 并侦听完成事件以在数据库中将该状态更改为 COMPLETED。每当我的服务器重新启动时,我都会获取所有处于 PENDING 状态的作业并将它们添加到队列中。这样,即使 Redis 出现故障或重新启动,我们也可以恢复我们的工作。我的问题是 - 在生产级应用程序中做这样的事情有意义吗?,我应该在 MongoDB 中保存工作吗?& 在实施此流程时,我还应该注意哪些其他事项?

尽管 Redis 是一个内存数据库,但您可以在大多数云提供商中启用持久性,或者按照 AWS Elasticache 中的标准添加复制,这将提供一个非常可靠的系统。当然,您应该像使用任何数据库一样为 Redis 持久数据安排备份,所有托管 Redis 提供商都会这样做。重要的是保持警报以防您的 Redis 实例内存不足,因为这会使您的队列停止工作。您可以启用“removeOnComplete”来避免您不再关心的作业的堆积。

现在,Bull 队列(让我们将其命名为“A”)正在快速服务器中进行初始化。每次服务器重新启动时,队列 A 也会被初始化。我的问题是 - 是否重新初始化队列 A,删除 Redis 上的旧队列 A?围绕这个问题我还能做些什么?

不,Bull/BullMQ 的设计目的是让您可以根据需要经常实例化相同的队列,并且不会丢失任何数据。事实上,这就是您可以通过为给定队列实例化尽可能多的工作人员来扩展工作人员的方式。


推荐阅读