开源的任务队列服务HTQ

1、什么是 HTQ

先介绍下基本概念。java

咱们在编写程序时,偶尔会遇到须要用到异步队列的状况。好比说,我发送一万封邮件,若是单纯使用一个for循环来发送,则执行时间要很长,要等好久才能发完,同时很容易致使阻塞、超时等问题。当邮件更多,好比一百万封的时候,问题会更加明显。这时最好的解决方案就是把这十万封邮件排队,一一发出去。这就是任务队列的概念。node

而且,咱们并不须要等到十万封邮件都发送完毕后才在网站前台通知用户。咱们能够把邮件一入队列,就通知用户。这样,用户等待的时间就不是漫长的“发十万封邮件”的时间,而是“把十万封邮件排队”的时间。所以能明显地缩短了用户等待时间。这就是异步的概念。git

HTQ ,全称 Http Task Queue ,是一个以Http方式执行异步任务的队列服务。你能够推送若干url进HTQ队列,HTQ会以Http GET 的方式访问这些url。若是url所在的脚本写上各类具体的任务操做,如发送邮件等,即可以实现异步操做了。HTQ使用node.js编写,可跟各类后台语言如PHP、java配合使用以加强异步处理能力。目前支持的队列类型有实时异步队列、定时异步队列、可变异步队列。github

若是你依然对HTQ陌生,则可往下看详细的应用场景以加深了解。redis

2、应用场景

一、实时异步队列npm

所谓实时,指的是把任务一推动队列就立刻执行。一个典型的应用场景就是咱们上面所说的发送邮件。邮件推送进任务队列,队列立刻把它发出去。若是它推动队列后有其余邮件正在发送中,它则等待当前邮件发送完毕后才发送。json

除了发邮件,咱们在发文章、发微博、发评论的时候均可以用得上HTQ的实时任务队列,尤为是数量很是大的时候。好比评论用户太多,若是一瞬间让服务器处理,服务器可能由于支撑不了过高的并发从而形成阻塞。这个时候就可让评论们进入队列再一一处理。安全

二、定时异步队列服务器

定时,顾名思义,就是在特定的时间执行任务队列。这种队列服务可用于定时邮件、定时短信。须要说明的是,这里的定时,不必定是精准的定时。假如你设置了明天12点执行某个任务,那么,它在明天12点的时候将进入队列。假如队列中已经有任务在执行,那么它会等待到前面的任务完毕才执行。此时多是12点01分钟才执行。网络

三、可变队列

咱们推送10个任务进队列,这10个队列会反复循环地执行,而且它们的执行快慢可以根据返回状况进行调整,这就是可变队列。好比,咱们作扫描监控,会反复地执行“扫描”这个任务。咱们但愿,在有异常状况的时候,能加快扫描的速度以便更快速地发现问题;而在没有长期异常的状况能减慢一下扫描速度以节省机器资源。

再举一个场景例子,经过API拉取微博新动态。咱们网站上有10万绑定了新浪微博的用户,咱们须要时常获取他们的最新动态以展现在咱们的网站的用户主页上。 若是是采用定时获取动态的方式,那么,假设1分钟能获取1千个用户的动态(由于受API使用频率和网络等缘由限制,咱们获取不了太快。这里先假设一个数字),那么,获取完全部用户状态须要100分钟。对用户来讲,他在微博更新动态后,100分钟后才显示到咱们网站。这明显滞后太多。有没有办法加快点呢?此时可使用HTQ的可变队列。可变队列会对长期没有更新动态的那部分不活跃用户进行减缓速度,减缓对他们微博的获取频率,同时加大对活跃用户的获取频率。这样,一个活跃用户更新微博后,可能10分钟就能同步到咱们网站了。对于不活跃用户,可能获取时间会变长了些,但没关系,咱们愿意分配更多的资源去知足活跃用户的需求。

使用可变队列,能让咱们有所侧重地使用咱们的资源,以减小浪费、增长利用率。

3、安装和使用

一、安装

首先安装好node环境和redis服务,请参考:http://nodejs.cn/download/http://redis.io/download

clone或下载代码:https://github.com/star7th/htq

下载到你想要放置的目录,命令行进入该目录,执行命令:

npm install

安装完毕后,执行如下命令启动:

node htq.js

上面这种启动方式是临时运行的,关闭命令行窗口就会中止了。若是想一直在后台运行,则可:

nohup node htq.js > ~/htq.log 2>&1 &

若是想关闭退出,可运行:

killall -9 node

二、如何使用

启动后,HTQ默认监听本机的5999端口。你能够经过此端口访问HTQ的APi,以添加队列和任务。详细的API文档可看:http://www.showdoc.cc/htq?page_id=37198

你能够根据API文档来在你的项目中调用API以新建任务。官方提供了一个PHP调用的SDK(在/PHPSDK目录)。欢迎其余语言的开发者也将HTQ的API封装成其余语言的SDK

若是要修改默认端口以及默认的redis地址,可修改配置文件config.json。修改完毕需重启HTQ才能生效

4、安全与容错

一、程序安全

访问HTQ 的API时须要填写简单的token认证,认证信息在配置文件config.json里定义。为了安全起见,你能够在下载代码将token设置为其余随机数。若是你已经启动了HTQ,则须要关闭后再重启才能让新配置生效。

若是你担忧直接执行url会带来安全隐患,怕本身暴露的url被外部访问,那你能够在推送进HTQ的url上带参数签名校验。而后在url触发的任务脚步里检验签名便可。

二、数据安全

HTQ使用redis来储存队列。Redis自身带有持久化功能。如另外须要对数据进行备份,则备份redis便可,不用在业务中实现数据备份。

三、正确性

HTQ能执行url,但不能保证业务上的正确。好比说HTQ确实是触发了发文章的脚本,然而这个脚步可能自身由于网络缘由发布文章失败。此时应该在业务层作好相应的容错处理,好比让该url从新入队列。

相关文章
相关标签/搜索