如何发挥NodeJS单线程异步非阻塞I/O性能优势?#Hbase #Thrift2
发布于 7 年前 作者 gilking 4047 次浏览 来自 问答

最近在做一个项目,后端框架是用的koa co+ generator的方案做rest API。 碰到一疑惑希望大神能帮忙指点一下, 其中一个业务场景需要根据key去Hbase中取对应的数据,因为key没有连续性所以如果有1000个key就需要取Hbase1000次数据。 我是用的thrift2去hbase拿,单次单次取数据大概每次花费10ms,一开始是这样写的

const result = [];
for (const i of keys) {
restlt.push(yield Promise.promisify(hbase.get(i)));
}

如果有1000个key那就是10s, 性能太差。所以后面改成了这种

let result = [];
for (const i of keys) {
restlt.push( Promise.promisify(hbase.get(i)));
}
yield result;

但是所花的时间跟上一种一样,请问promise的并行执行不比顺序执行更快吗? 这种业务场景应该如何处理更好?

8 回复

这个Promise(hbase.get(keys))是什么意思啊?不是get(i),这个Promise是什么第三方库吗?也没看懂怎么用的.

@leemove 不好意思写错了,修改了一下,是get(i),Promise是用的bluebird的,后面少写了promisify

Promise.all([])

你这个问题有点大,但除了异步 io,你还可以引进多进程,这样更强劲

缓存,把已经拿到的作缓存,下次再拿时先找缓存,注意数据同步,缓存大小

来自酷炫的 CNodeMD

只能说hbase的性能很好,而promise的性能一般, 尤其是你给出的时间 10ms, 很好的一个证据。 你可以空跑1000循环,不发起hbase.get, 做个对比, 说不定空跑本身还消耗个3-5 ms

@htoooth co可以直接yield一个promise数组的

你这个好像写错了吧 我理解的应该是这样写吧

let result = [];
let promiseFunction = Promise.promisify(hbase.get);
for (const i of keys) {
restlt.push(promiseFunction(i));
}
yield result;

你上面写的只是把返回的结果变成promise 并不是异步执行查询操作的吧。

回到顶部