最近在做一个项目,后端框架是用的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的并行执行不比顺序执行更快吗? 这种业务场景应该如何处理更好?
这个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 并不是异步执行查询操作的吧。