任务的小背景-我正在为Shopify建立废弃的购物车回收系统。当用户进行签出后,Shopify调用我们的web钩子,并且web钩子将请求作为一个队列A中延迟5分钟的作业排队。当工作人员开始处理该作业时,它会检查该签出是否已经支付。如果它还没有被支付,那么它会向用户发送购物车恢复消息。
我使用Node.js、Express.js、Redis和BullMQ来实现服务器和队列系统。我已经尝试过BUllMQ的基本例子。在网络上,无法找到一些先进的例子,如何在生产级系统中使用它。
现在,我被这些问题困住了-
我非常感谢在这方面提供的任何帮助。
发布于 2021-07-15 11:35:46
让我给你一些问题的答案:
由于Redis是内存中的数据库,所以我必须保存我的MongoDB集合中的每个传入作业,最初状态为挂起,然后侦听完成事件,以便将状态更改为在数据库中完成。每当我的服务器重新启动时,我会获取所有具有挂起状态的作业,并将它们添加到队列中。这样我们就可以恢复我们的工作,即使Redis破产或重新启动。我的问题是-在生产级应用程序中这样做有意义吗?我应该在MongoDB中节省工作吗?&为了实现这个流程,我还需要采取什么其他的谨慎措施呢?
尽管Redis是一个内存中的数据库,但您可以在大多数云提供商中启用持久化,或者按照Although中的标准添加复制,这将提供一个非常可靠的系统。当然,您应该像任何数据库一样为您的Redis持久化数据安排备份,所有托管Redis提供程序都会这样做。重要的是保持警报,以防Redis实例内存不足,因为这将使您的队列停止工作。您可以启用"removeOnComplete“来避免您不再关心的任务的积累。
现在,Bull队列(让我们命名为'A')正在快速服务器中初始化。每次服务器重新启动时,队列A也会被初始化。我的问题是-重新初始化队列A,删除Redis上的旧队列A吗?我还能做些什么来解决这个问题?
不,Bull/BullMQ的设计是为了使您可以根据需要实例化相同的队列,并且不会丢失任何数据。实际上,这就是通过为给定队列实例化任意数量的工作人员的方式。
https://stackoverflow.com/questions/66005917
复制相似问题