在API的使用流之间传输数据?

时间:2019-11-12 21:41:47

标签: javascript node.js nodejs-stream

我对javascript和node还是很陌生,我正在尝试使用Node构建一个数据传输应用程序,该应用程序可以在2个数据库之间传输大量数据(有时多达200k +行)。

“登台”数据库运行ETL,该ETL从“来源”数据库收集所有新数据。目标是从暂存数据库中获取所有数据,对其进行评估以确定是应该是新行(POST请求)还是更新现有行(PUT请求),然后将所有数据发送到“目标”数据库。 / p>

我不必担心Staging和Origin之间运行的ETL。我只需要简化登台数据库和目标数据库之间的数据传输即可。

我创建了一个简单的Express API,该API连接到Staging数据库,并且目标DB已经存在一个API。因此,我为要更新的每个表编写了一些HTML / CSS / JS和一些按钮。每个按钮都会触发一个函数,该函数使用Fetch API将GET请求发送到Staging数据库以获取所有新记录。然后,我将GET请求发送到Destination db以获取所有现有记录。然后,我遍历每条新记录以查看它们是否已存在并将它们分开。之后,我最终得到2个单独的对象,其中一个是应作为POST请求发送的所有记录的数组,另一个是作为PUT请求发送的。然后,我遍历每个数组,并将每个请求发送到目标数据库。

我的问题是我最终耗尽了堆内存,并且在发送大约10万个请求后,应用程序崩溃了。我的猜测是POST和PUT请求的堆积速度快于它们处理所有可用内存的速度。我尝试了一些使用bluebird处理并发的变体,并首先将原始数组拆分为多个块,但最终还是遇到了同样的问题。同样,所有这些逻辑都是在浏览器的客户端完成的。我应该将所有这些内容移到Express API并使用“ node-fetch” npm程序包在服务器端发出这些请求吗?

我读过几篇文章,建议流是在不增加内存的情况下传递大量数据的不错选择。我仍在阅读有关如何实现它们的信息,但是我想确保在花时间尝试使用它之前,先确定它是一个可行的选择。

使用流代替会是一个好案例吗?对登台数据库的GET请求可以返回流吗?我该如何处理POST和PUT数据之间的分隔,以及如何在处理这些请求时实际发送这些请求?

我将不胜感激,因为我已经尝试了一段时间了。我似乎找不到一个很好的例子来说明我要做什么。

谢谢。

0 个答案:

没有答案