精品 一个基于Promise的nodejs队列控制类
发布于 10 年前 作者 cnwhy 13348 次预览 最后一次回复是 10 年前 来自 分享
场景一:
现在的web应用可能都是一个这样的结构:
http服务(node) > 接口(业务逻辑) > 数据库
很多时候,瓶颈一般出现在业务层,或者数据层。更多的可能是某一个业务的处理,拉下整个系统的性能。
当用户或一些不怀好意的人,故意大量调用这些处理逻辑,好吧,你nodejs是非阻塞的,这一大波处理请求就一窝蜂冲到到业务层,很可能导致整个系统性能下降,或者瘫痪。
如果这个时候,node层就把这些耗资源的请求,排好队,控制好并发,甚至分用户排成队,配置好不同身份的用户并发量,不是很爽。
场景二:
应用中,可能会有一些无需即时处理的同一类业务,处理前都需要收集一次资源,处理业务,处理后再清理一次。高消耗工作主要在收集或是清理上。
如果我们将要处理的业务暂存到队列中,当队列数量到达一个值或是某个时间点时,我们一次性处理完队列中的任务。在消耗上,只做一次“收集”、“清理”的操作。
我的想法是,并不需要把整个业务的后续处理全都放到队列中去,而只是将高消耗的那一部分放入队列,利用Promise的异部处理机制来处理后续的操作。 在编写代码的时候你几乎可以忘记队列的存在,但是他就在那里默默的工作着,代码可读性和灵活性没有丝毫影响。
项目地址:
https://github.com/cnwhy/queue-fun
安装
npm install quque-fun
7 回复
v0.2.1 发布了
还是贴个demo吧
我之前做过一个类似的q-parallel,用来做爬虫,在一个队列任务里面爬另外一个网站的数据,可以控制同时并发的任务数,我的需求比较简单,后来发现原来tj大神也写过一个类似的库 co-parallel,他用了es6的Generator 大神写得简单,就这么几行
bluebird 中的 Promise.map async.parallelLimit 都是干这个的
@magicdawn 这个队列是持续存在的,可以随时加入队列。为每一个运行项定义后续。 而且,这个队列可以定义更多的功能,比如超时,出错重试等。
@hcnode 我写这个的宗旨在于创建一个持续存在的公用队列,想用的时候随时用,不影响后续操作。不只是控制并发。
就拿爬虫打个比方: 采集整个站点,不可能把URL先猜好,放那里吧,只能是这样。
这样设计刚开始没问题,但只要运行不到10秒,系统就受不了。平均每个页面算10个有效链接,爬3层深10x10x10,可能系统就会同时request上千个页面,不是被禁就是自己假死/溢出,显然不合理。
这里就很有必要引入一个队列:
简化的代码如下
@cnwhy 是的,因为我并没有做队列的维护和管理,因为我的需求比较简单,呵呵,我觉得你这里也可以再优化一下,把执行的任务,将promise封装一下,调用者就只管defer的action:
@hcnode 其实现阶段所有的API 都是可以商量的,毕竟我一个人考虑到的有限,欢迎到issues讨论。
顺便说一句,如果API有变动,我会改变中的的版本号,当然我我会尽量做好兼容