CNode

如何发挥NodeJS单线程异步非阻塞I/O性能优势?#Hbase #Thrift2

问答
Ggilking发布于9 年前最后回复9 年前8 回复4829 浏览0 收藏

最近在做一个项目,后端框架是用的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)

L
leemove#1·9 年前

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

G
gilking#2·9 年前
引用 leemove这个Promise(hbase.get(keys))是什么意思啊?不是get(i),这个Promise是什么第三方库吗?也没看懂怎么用的.

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

H
htoooth#3·9 年前

Promise.all([])

H
Hyurl#4·9 年前

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

Z
zswnew#5·9 年前

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

来自酷炫的 CNodeMD

F
fish#6·9 年前

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

A
AnzerWall#7·9 年前
引用 htooothPromise.all([])

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

I
ipengyo#8·9 年前

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

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

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

参与回复
登录后即可参与回复。登录