nodejs 插入 ElasticSearch 的 api 操作直接异步执行了,插入数据太多 如何保持低速比较好

2018-07-28 11:46:43 +08:00
 whereabouts
用了 ElasticSearch 官方的 nodejs 包,发现
ElasticSearchClient.index({
index; "name",
type: "name",
body: someJson},
function(err, resp, status){ dosomething..}
});

是直接异步执行了,对于数据仓库几千万行直接就蹦了,循环插入就机器资源撑不住。
希望能保持每时每刻并发插入几百个,每个插入线程(形容不准确)插入完了再插入下一个,类似线程池的概念。
NodeJs 有什么比较好的方法吗?
1949 次点击
所在节点    问与答
6 条回复
richard1122
2018-07-28 12:47:18 +08:00
http://bluebirdjs.com/docs/api/promise.map.html

第三方的 promise 实现自带了并发限制,或者随便找个现成的库
ctsed
2018-07-28 12:47:37 +08:00
async.js queue
hcymk2
2018-07-28 13:12:15 +08:00
bulk
noe132
2018-07-28 15:49:41 +08:00
我之前写的一个异步队列的程序,
用的是 TokenBucket + 并发控制,
TokenBucket 就是基础的令牌桶,我用 ts 简单实现的。

https://gist.github.com/noe132/a7885918ab4fb083ea5ce0316b6f11a2

通过 TokenBucket 来限制任务的最大并发速度
通过 concurrecy 来限制异步队列的最大数目
这样并发数能控制下来, 异步队列也不会一次推入过多爆掉

判断没有任务可做,并且 concurrency 为 0 时就做完了,就可以调用 tokenBucket.destroyed()销毁定时器。

还可以自己封装一下,提高抽象级别
noe132
2018-07-28 15:51:49 +08:00
我写了个滑动窗口测速,上面的并发限制基本很准,误差在±5%左右,和 token bucket 的一些参数有关。
RqPS6rhmP3Nyn3Tm
2018-07-28 17:22:05 +08:00
bulk
最差也能 promise 串一遍

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/474881

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX