github: https://github.com/star7th/htq

部分介绍:

  

先介绍下基本概念。

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

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

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

按照教程进程htq的安装:

  1、安装

首先安装好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 

这里我是使用的pm2任务管理工具,这里介绍一下这个工具:

  

pm2是一个带有负载均衡功能的Node应用的进程管理器。当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的。

PM2是开源的基于Nodejs的进程管理器,包括守护进程,监控,日志的一整套完整的功能,基本是Nodejs应用程序不二的守护进程选择,事实上它并不仅仅可以启动Nodejs的程序,只要是一般的脚本的程序它同样可以胜任。

主要特性:

  • 内建负载均衡(使用Node cluster 集群模块)
  • 后台运行
  • 0秒停机重载(这项功能允许你重新载入代码而不用失去请求连接。)
  • 具有Ubuntu和CentOS 的启动脚本
  • 停止不稳定的进程(避免无限循环)
  • 控制台检测
  • 提供 HTTP API
  • 远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )

使用环境:

  • 仅能用于web应用
  • 运行于Node 0.11.x版本
  • 运行于 cluster 模式(默认模式)

安装:

npm install -g pm2

用法:

npm install pm2 -g                   # 命令行安装 pm2
pm2 start app.js -i 4 #后台运行pm2,启动4个app.js
# 也可以把'max' 参数传递给 start
# 正确的进程数目依赖于Cpu的核心数目
pm2 start app.js --name my-api # 命名进程
pm2 list # 显示所有进程状态
pm2 monit # 监视所有进程
pm2 logs # 显示所有进程日志
pm2 stop all # 停止所有进程
pm2 restart all # 重启所有进程
pm2 reload all # 0秒停机重载进程 (用于 NETWORKED 进程)
pm2 stop 0 # 停止指定的进程
pm2 restart 0 # 重启指定的进程
pm2 startup # 产生 init 脚本 保持进程活着
pm2 web # 运行健壮的 computer API endpoint (http://localhost:9615)
pm2 delete 0 # 杀死指定的进程
pm2 delete all # 杀死全部进程

运行进程的不同方式:

$ pm2 start app.js -i max  # 根据有效CPU数目启动最大进程数目
$ pm2 start app.js -i 3 # 启动3个进程
$ pm2 start app.js -x #用fork模式启动 app.js 而不是使用 cluster
$ pm2 start app.js -x -- -a 23 # 用fork模式启动 app.js 并且传递参数 (-a 23)
$ pm2 start app.js --name serverone # 启动一个进程并把它命名为 serverone
$ pm2 stop serverone # 停止 serverone 进程
$ pm2 start app.json # 启动进程, 在 app.json里设置选项
$ pm2 start app.js -i max -- -a 23 #在--之后给 app.js 传递参数
$ pm2 start app.js -i max -e err.log -o out.log # 启动 并 生成一个配置文件
你也可以执行用其他语言编写的app ( fork 模式):
$ pm2 start my-bash-script.sh -x --interpreter bash
$ pm2 start my-python-script.py -x --interpreter python

然后参考接口文档添加队列并添加任务:https://www.showdoc.com.cn/htq?page_id=37198

注意点:

  1.  往队列中添加任务的时候,只有是定时队列的时候需要传递参数execute_time,否则不需要传递,
  2. 实践验证及时队列和定时队列可以正常执行,而可变队列无法正常使用(按照文档操作无误,无法触发定时任务。。。)

个人认为这种方式处理任务虽然可以执行,但是更偏向于小型项目,缺点也很明显,无法记录定时任务执行的日志,有条件还是使用专业的消息队列来执行类似任务!!!

Htq-基于Node.js的异步队列的更多相关文章

  1. 【译】深入理解python3.4中Asyncio库与Node.js的异步IO机制

    转载自http://xidui.github.io/2015/10/29/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3python3-4-Asyncio%E5%BA%93% ...

  2. 基于node.js制作爬虫教程

    前言:最近想学习node.js,突然在网上看到基于node的爬虫制作教程,所以简单学习了一下,把这篇文章分享给同样初学node.js的朋友. 目标:爬取 http://tweixin.yueyishu ...

  3. koa : Express出品的下一代基于Node.js的web框架

    https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434501579966a ...

  4. Node.js之异步编程

    > 文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. ![file](https://img2018.cnblogs.com/blog/830272/20 ...

  5. NodeBB – 基于 Node.js 的开源论坛系统

    NodeBB 是一个更好的论坛平台,专门为现代网络打造.它是免费的,易于使用. NodeBB 论坛软件是基于 Node.js 开发,支持 Redis 或 MongoDB 的数据库.它利用 Web So ...

  6. 基于 Node.js 平台,快速、开放、极简的 web 开发框架。

    资料地址:http://www.expressjs.com.cn/ Express 基于 Node.js 平台,快速.开放.极简的 web 开发框架. $ npm install express -- ...

  7. Pomelo:网易开源基于 Node.js 的游戏服务端框架

    Pomelo:网易开源基于 Node.js 的游戏服务端框架 https://github.com/NetEase/pomelo/wiki/Home-in-Chinese

  8. Fenix – 基于 Node.js 的桌面静态 Web 服务器

    Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...

  9. 基于Node.js + jade + Mongoose 模仿gokk.tv

    原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 关于gokk 大学的娱乐活动基本就是在寝室看电影了→_→,一般都会选择去goxiazai.cc上看,里面的资源多,质量高 ...

  10. 基于Node.js的实时推送 juggernaut

    基于Node.js的实时推送 juggernaut Juggernaut 基于 Node.js 构建.为浏览器和服务器端提供一个实时的连接,可在客户端和服务器端进行数据的实时推送,适合多角色游戏.聊天 ...

随机推荐

  1. Java读取寄存器数据的方法

    在Java中直接读取硬件寄存器(如CPU寄存器.I/O端口等)通常不是一个直接的任务,因为Java设计之初就是为了跨平台的安全性和易用性,它并不直接提供访问底层硬件的API.不过,在嵌入式系统.工业控 ...

  2. namenode rpc 请求队列调优

    当 datanode 上新写完一个块,默认会立即汇报给 namenode.在一个大规模 Hadoop 集群上,每时每刻都在写数据,datanode 上随时都会有写完数据块然后汇报给 namenode ...

  3. PHP面试,ES

    什么是Elasticsearch? Elasticsearch是一个开源的分布式搜索和分析引擎,用于存储.搜索和分析大量数据.它基于Lucene搜索引擎构建,可以快速地执行全文搜索.结构化查询.分析和 ...

  4. `std::packaged_task`、`std::thread` 和 `std::async` 的区别与联系

    std::packaged_task.std::thread 和 std::async 的区别与联系 std::packaged_task.std::thread 和 std::async 都是 C+ ...

  5. uart loglevel和pr_debug的区别

    pr_debug 是 Linux 内核中用于打印调试信息的宏,它的行为会根据编译时的配置有所不同.如果定义了 CONFIG_DYNAMIC_DEBUG 配置选项,pr_debug 会扩展为 dynam ...

  6. USB gadget驱动框架(三)

    gadget驱动框架(三) usb_udc与usb_gadget_driver的绑定 usb_udc与usb_gadget_driver,在注册的时候分别被添加到udc_list和gadget_dri ...

  7. Java日期时间API系列36-----Jdk8中java.time包中的新的日期时间API类应用,使用LocalTime计算十二时辰。

    十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰.二十四小时和十二时辰对照表:     时辰 时间 24时制 子时 深夜 11:00 - 凌晨 01:00 23:00 - 01 : ...

  8. 80篇国产数据库实操文档汇总(含TiDB、达梦、openGauss等)

    国产数据库发展得如火如荼,数据库的国产化替代也正在进行中.最近,有越来越多的朋友都加入了学习国产数据库的队伍中,本文便选取了墨天轮技术社区的国产数据库流行度排行榜上排名靠前的几个数据库,整理了相关的实 ...

  9. Vue中如何自定义过滤器 ?

    过滤器可以格式化我们所需要的数据格式  : 自定义过滤器分为全局和局部过滤器: 全局过滤器在 main.js 中使用 Vue.direct4ive( 过滤器名字,定义过滤器的具体行为函数 ) : 局部 ...

  10. 查找大量时序遥感文件缺失、不连贯的成像日期:Python代码

      本文介绍批量下载大量多时相的遥感影像文件后,基于Python语言与每一景遥感影像文件的文件名,对这些已下载的影像文件加以缺失情况的核对,并自动统计.列出未下载影像所对应的时相的方法.   批量下载 ...