项目使用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 ...
随机推荐
- iframe框架下的某一页面跳转到另外一个页面
//iframe只在当前页跳转 window.location = "/Admin/Blog/Index"; 只在当前页跳转 而不是整个页面都跳转
- 理解js参数
<!DOCTYPE html><html><head> <meta charset="utf-8" /> <title> ...
- VirtualBox 6 安装 CentOS 7
1 安装环境 windows7 Oracle VM VirtualBox 6.0.24 CentOS 7 2 VirtualBox 6 - 虚拟机软件 2.1 下载 Oracle VM Virtual ...
- 08flask中get和post请求。
1,get请求. 使用场景:获取信息并没有对服务器的数据或者资源进行修改,则用get. 传参:get请求传参是放在URL中,通过"?"的形式指定键值对. 2,post请求. 使用场 ...
- 运维告警排班太复杂?试试Cloud Alert智能告警排班
前言: 之前的几篇文章有说过,通过智能告警平台Cloud Alert,将指定条件的告警以多样化的通知方式,通知到指定的人,其中的通知的方式包含电话.短信.邮件.微信.APP.钉钉等. 本篇文章就来说下 ...
- 彻底卸载MySQL5.7(msi,exe)版
1,停止MySQL服务 2,右键找到任务管理器 3,在程序中卸载MySQL 4,删除MySQL安装目录 有的是在C:\Program Files下,我的是在(X86)下 5,删除隐藏文件中的MySQL ...
- Javaer 进阶必看的 RocketMQ ,就这篇了
每个时代,都不会亏待会学习的人. 大家好,我是 yes. 继上一篇 头条终面:写个消息中间件 ,我提到实现消息中间件的一些关键点,今天就和大家一起深入生产级别消息中间件 - RocketMQ 的内核实 ...
- Python_PyQt5_eric6 做省市县筛选框
eric是PyQt5的图形化编辑工具,界面如下(另存为-桌面 查看大图) 下面是用eric6制作的 省市县 三级联动筛选框 (效果图+源码) 1 # -*- coding: utf-8 -*- 2 ...
- linux打包 压缩 解压tar常归操作
tar 打包 tar -cvf 打包后路径和文件名.tar 需要打包的路径和文件压缩 tar -zcvf 打包后路径和文件名.tar.gz 需要打包的路径和文件解压 tar -xvf 包名 -C 路径 ...
- RSA(攻防世界)Rsa256 -- cr4-poor-rsa
RSA256 [攻防世界] 题目链接 [RSA256] 下载附件得到两个文件. 猜测第一个 txt 文件 可能为RSA加密密文 ,第二个估计就是密钥.依次打开看看: 果然如此. 目标: 寻找 n.e. ...