项目使用RQ队列的思考
碎遮项目的后端异步处理经历了
无处理->多线程/多进程->celery异步队列->RQ队列
的调整和修改,先简单说明一下为什么会存在这样的过程。
在nmap的使用指南中,提到过这样的一段话:
作为一个修车新手,我可能折腾几个小时来摸索怎样把基本工具(锤子,胶带,扳子等) 用于手头的任务。当我惨痛地失败,把我的老爷车拖到一个真正的技师那儿的时候 ,他总是在他的工具箱里翻来翻去,直到拽出一个完美的工具然后似乎不费吹灰之力搞定它。 端口扫描的艺术和这个类似。专家理解成打的扫描技术,选择最适合的一种 (或者组合)来完成给定的 任务。 另一方面,没有经验的用户和刚入门者总是用默认的SYN扫描解决每个问题。 既然Nmap是免费的,掌握端口扫描的唯一障碍就是知识。这当然是汽车世界所不能比的, 在那里,可能需要高超的技巧才能确定您需要一个压杆弹簧压缩机,接着您还得为它付数千美金。
虽然我们暂时没有修改nmap源代码的想法,但是作为一个项目的开发者,开发的熟练和不熟练决定了处理问题时选择相应队列和框架的方案。
因为作者是web应用的不熟练开发人员,所以在开发的过程中难免会踩一些坑。
个人首先感觉是
在不同的需求下选择合适的框架
最开始的时候,还没有对后端进行异步处理,因为当时还只是显示一个界面,对于输入的URL也没有进行相应信息的搜集,只是获取输入,所以能够很快返回给前端。
但是添加了漏扫和信息搜集模块之后,假如一个URL需要扫描2分钟,不可能让使用的用户等待两分钟,前端显示界面一直在转圈刷新,这样的用户体验过于差,所以作者在网上找了找,发现了可以使用多线程或者多进程来进行扫描任务的执行,也就是:输入扫描URL,新开一个线程/进程进行处理,主线程先给用户返回一个正常的前端界面,用户可以继续浏览和点击界面。
作者分别使用了线程和进程来实现后端异步的处理,但是线程无法最大限度地发挥多核CPU的威力,所以最后选择了多进程来进行后端异步的处理。问题也相应出现,在我们的项目反馈群里面,有人提到:1,多输入几次URL之后项目容易卡死;2,不能暂停任务,比如输入了一个大型网站的URL,扫描的时间比较长,我扫到一半不想扫了,不能中止掉。
问题一产生的原因我想是电脑CPU有限,在现有进程已经开满的情况下还想继续新建进程,或许就会导致项目卡住,问题二,对于多进程的终止,目前还没有看到比较好的个人实现的方案。
于是只好使用Python Flask支持的异步队列,来实现后端异步的功能,起初选择了Celery框架,在一台云服务器上能够成功进行多任务的执行,同时能够扫描10个URL,本以为异步处理的问题已经告一段落,作者准备完善终止任务功能:获取Celery任务的ID显示在前端,可以通过用户的点击来进行取消。没想到先出现的问题是,部分服务器运行扫描器的时候,输入一个URL扫描一个上午,很明显这是后端卡住了。我在另一台学生机上进行实验,发现单个URL会在进行内置POC扫描的时候卡住,原因应该是:内置POC扫描开了多线程,Celery本身框架比较重,性能不太好的服务器可能就带不动,最终导致卡住。
经反馈群中一位老哥推荐,抛弃Celery队列(而确实,扫描器实际上用不上这么重型的队列),使用更加轻量的队列RQ,(Redis Queue)是一个简单的Python库,用于队列任务并在后台与工人(worker)一起处理它们。它由Redis提供支持,旨在降低入门门槛。它可以轻松集成到您的Web堆栈中。
经过Docker配置的一些坑之后,还是将RQ整合到了项目中,后面或许还会根据不同的情况进行相应的调整,这段时间应该都会使用RQ了。
轻装上阵,继续努力
项目使用RQ队列的思考的更多相关文章
- Docker下Python Flask+Redis+MySQL+RQ队列简单配置
本篇博文主要讲解Docker下使用RQ队列的通信配置,主要是网上的部分文章写的不太清楚,特写一篇 作者使用docker-compose.yml文件调度各部分文件Dockerfile,起初是这样写的 v ...
- PMP备考_第五章_项目范围管理_实践思考
项目范围管理 前言 今天学习项目范围管理的内容,深切的感受到了原单位在项目管理方面存在的问题,今天在这里做一个总结,既相当于对项目范围的一个学习整理,也相当于自己对项目实践过程中存在问题的一个思考. ...
- 第十一章 企业项目开发--消息队列activemq
注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2) 代码的github地址:https://github.com/zhaojigang/ssmm0 消息队列是分布式系统中实现RPC ...
- springboot项目 线程消费队列注入报错误空指针
背景: 在调用阿里云隐私保护有一个通话记录的回执消息是一个消费线程队列,这个还别人告诉我的,因为我根本没有看出来哪里是个线程了,然后我就把它当成普通的代码拿到返回值以后然后插入数据库 可是我这边该加的 ...
- 【实战】某项目SQL注入引发的思考
数据包: 测试参数:username,测试payload: ' ' or '1'='1 ' or '1'='2 响应结果都未发生任何变化,借助sqlmap测试,结果一样: 尝试在or前面进行简单的fu ...
- 从壹开始 [ Ids4实战 ] 之五 ║ 多项目集成统一认证中心的思考
前言 哈喽大家好,好久都没有写文章了,这次又重新开始写技术文章了,半年前我还是一直保持每周都写文章的,后来是为了响应群友的号召,开始踏上了录制视频(https://www.bilibili.com/v ...
- Java 小记 — Spring Boot 的实践与思考
前言 本篇随笔用于记录我在学习 Java 和构建 Spring Boot 项目过程中的一些思考,包含架构.组件和部署方式等.下文仅为概要,待闲时逐一整理为详细文档. 1. 组件 开源社区如火如荼,若在 ...
- 【git学习二】git基础之git管理本地项目
1.背景 git基础打算分两部分来说,一部分是对于本地项目的管理,第二部分是对于远程代码仓库的操作. git运行本地项目管理包含对于相关文件的追踪,暂存区的比較分析,提交,撤销等功能. ...
- Redis缓存项目应用架构设计一
一些项目整理出的项目中引入缓存的架构设计方案,希望能帮助你更好地管理项目缓存,作者水平有限,如有不足还望指点. 一.基础结构介绍 项目中对外提供方法的是CacheProvider和MQProvider ...
随机推荐
- layui tempalte添加函数
@*超链接action展示*@ <script type="text/html" id="ShowAction"> {{# if(d.DealSta ...
- kudu1.10基于cdh6.3.1搭建
1.下载kudu依赖: yum -y install cyrus-sasl-plain ntp 2.下载kudu rpm包: wget https://archive.cloudera.com/c ...
- 协程实现爬虫的例子主要优势在于充分利用IO时间去请求其他的url
# 分别使用urlopen和requests两个模块进行演示 # import requests # 需要安装的 # from urllib.request import urlopen # # ur ...
- 每天一个linux命令之stat
[Linux]Linux下使用stat命令所显示出来的三个时间 转 https://blog.csdn.net/pointer_y/article/details/54347968 在linux系统下 ...
- 三步删除U深度,老毛桃,大白菜捆绑软件!!
①需要下载一个软件Fbinst Tool(万能U盘制作工具).链接:http://pan.baidu.com/s/1mim9Zxm 密码:7poo②插入U盘,直接打开Fbinst Tool.首先是U深 ...
- 算法基础——KMP字符串匹配
原题链接 题目: 给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字. 模板串P在模式串S中多次作为子串出现. 求出模板串P在模式串S中所有出现的位置的起始下标. 输入 ...
- PVE 下的虚拟机磁盘扩容
扩容背景:一台测试机磁盘不足,需要扩容: /dev/mapper/centos-root 40G 40G 20K 100% / 先到PVE网页上对需要扩容的机器扩容,这里新建20G示例: 另外之前也分 ...
- 教你用Camtasia制作精美片头
大家都知道在视频播放中,如果有一个令人印象深刻的精彩开头,整个视频的内容都能因此得到不少升华.所以有一个好的片头对于视频的制作来说十分重要.今天我们就来讲一下用Camtasia制作片头的方法. 首先, ...
- Vegas的软对比具体如何设置
软对比是Vegas中比较常用的一个视频特效,通过这一特效可以让视频画面更加柔和.而对于新手用户来说,软对比显得有些陌生,不知道该如何使用. 本集主要为大家介绍:sony vegas的软对比. 在视频制 ...
- 工作中用到的redis操作
del exists 1.字符串 set,get 2.列表 lRange lRem lPush rPush 3.有序列表 zadd zrem zscore 4.hash hset hget hdel