【问题标题】:how to handle long running database process with node.js?如何使用 node.js 处理长时间运行的数据库进程?
【发布时间】:2021-09-23 08:57:01
【问题描述】:

对不起,如果这个问题听起来真的很无聊,我只是不知道用谷歌搜索什么。

假设我有一个从数据库中获取 10000 行的函数,对其进行处理,然后作为 Excel 文件返回。

它可以工作,但需要大约 2 - 3 分钟的时间,并且让其他操作变得缓慢,然后我打算做的是让导出功能将它移动到它自己的服务器上,这意味着我有 2 个快速服务器正在运行,1用于管理面板,1 仅用于导出功能。

因此管理面板将通过 socket.io 告诉导出服务器执行导出过程

如果我想让导出服务器持续大约 30 分钟以导出数据,并且如果有另一个导出请求,它会等待第一个请求完成,那么最好使用什么方法/技术。就像你向谷歌询问你的数据一样,他们会在几天内完成,但你不会在同一个屏幕上等待几天,他们只会在你完成后给你发电子邮件

我真正要问的是我应该用谷歌搜索什么词或技术来知道我描述的整个过程被称为什么。对不起,如果这个问题听起来真的很无聊,我只是不知道用谷歌搜索什么。

【问题讨论】:

    标签: mysql node.js express export long-running-processes


    【解决方案1】:

    有几点:

    1. 将这条神秘的TRANSACTION ISOLATION LEVEL SQL 语句放在执行导出的长时间运行的 SQL 语句之前将减少导出与其余操作之间的干扰。

      SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
      

      这允许您在不干扰其他数据库工作负载的情况下继续进行导出。但是重要这意味着在导出过程中更新/删除/插入的行可能无法正确读取。如果您的导出仅用于历史数据,或者如果您的工作负载不使用很多事务,则错误数据的风险很小。

      如果没有这个,您的导出很可能仍会干扰您的其余数据库工作负载,即使您将其放入单独的 nodejs / express 服务器。

    2. 您想要一次执行这些“离线”导出的概念是工作队列。队列可以非常简单:只是一个数组。你把事情放到工作队列中

      queue.push(queueItem)
      

      并在您准备好执行它们时将它们从队列中移除。

      const queueItem = queue.count > 0 ? queue.shift() : null 
      

      或者,如有必要,工作队列可以更加精细。消息队列、redis 和 apache kafka 只是一些替代方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 2016-02-04
      • 1970-01-01
      • 2013-10-05
      • 2016-01-03
      • 2016-10-13
      • 1970-01-01
      相关资源
      最近更新 更多