admin管理员组

文章数量:814781

从数据库在Nodejs中基于FCFS运行作业

我正在开发NodeJS应用程序,其中用户可以安排要运行的作业(CPU密集型)。我保持事件循环自由,并希望在一个单独的过程中运行作业。当用户提交作业时,我在数据库(PostgreSQL)中输入了时间戳,时间戳以及其他信息。进程应按FCFS顺序运行。通过对stackoverflow的一些研究,我发现有人建议将Bulljs(与Redis配合使用),Kue,RabbitMQ等作为解决方案。 我的疑问是,为什么我只能轮询数据库并获得最旧的作业,为什么需要使用那些?我不打算以固定的时间间隔轮询数据库,而仅当当前作业完成执行时才轮询。

我的应用程序没有收到太多同时请求。用户也不必等待作业完成。相反,他们注销并在作业完成时通过邮件收到通知。使用child_process(spawn / exec)模块作为解决方案的潜在缺点是什么?

回答如下:

我的疑问是,为什么我只能轮询数据库并获得最旧的工作,为什么需要使用那些?

您如何计划处理故障?如果Node.js在进行中的工作中崩溃,那会影响您的用户吗?然后,您会重试失败的工作吗?您如何支持退避?应该多少次尝试才能完全停止?

这些问题在Bull实现,RabbitMQ和您将为当前挑战找到的几乎所有解决方案中得到了回答。

从我注意到的(child_process)来看,这是一个较低级别的实现(在Node.js中为较低级别),这意味着不包括您通常需要的许多功能(故障转移/退避)。您必须实现此。

在这通常会带来更多麻烦,但当然,管理,监视和部署Redis服务器可能也不是最佳解决方案。

您是否考虑过另一种方法,定期的CRON工作将如何工作? (例如)。

这种系统的挑战通常是您计划如何处理故障以及故障对应用程序和最终用户的影响。

我会说,在Bull的辩护中,对于CPU密集型任务,我更喜欢使用工作进程的单独实例,然后我可以根据需要多次部署该单个进程。这使我的后端代码保持分离,并且通常更易于管理,同时还使我能够在需要时轻松按比例放大/缩小。

编辑:我提到“麻烦多于其所能解决的”,如果您想真正学习如何开发此类技术,请使用子进程并在顶部构建自己的抽象,如果今天需要使用,请使用Bull,RabbitMQ或任何专用的替代产品。

本文标签: 从数据库在Nodejs中基于FCFS运行作业