zoukankan      html  css  js  c++  java
  • Htq-基于Node.js的异步队列

      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. 实践验证及时队列和定时队列可以正常执行,而可变队列无法正常使用(按照文档操作无误,无法触发定时任务。。。)

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

  • 相关阅读:
    网络编程
    常用模块补充
    面向对象进阶
    面向对象 --- 封装
    面向对象 三大特性--多态
    python 面向对象三大特性
    python 面向对象
    python 模块与包
    如何在Word的方框中打对号
    关于VS 2013连接Microsoft Access 2013的相关问题
  • 原文地址:https://www.cnblogs.com/xingxia/p/queue_htq.html
Copyright © 2011-2022 走看看