项目使用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 ...
随机推荐
- SpringBoot第七集:异常处理与整合JSR303校验(2020最新最易懂)
SpringBoot第七集:异常处理与整合JSR303校验(2020最新最易懂) 一.SpringBoot全局异常 先讲下什么是全局异常处理器? 全局异常处理器就是把整个系统的异常统一自动处理,程序员 ...
- Reactor详解之:异常处理
目录 简介 Reactor的异常一般处理方法 各种异常处理方式详解 Static Fallback Value Fallback Method Dynamic Fallback Value Catch ...
- CentOS 8.x 下尝试安装.Net 5 的运行时
1.背景 看着不管是群里还是公众号里这几天最热闹就是.Net 5.0 正式版的发布.C#9. 当然要开发.net 5.0 的项目就需要把VisualStudio升级的v16.8.0版本了.升级后自带着 ...
- wcf调用时时间参数问题,返回值中有日期格式得值得问题
第一种情况,客户端在调用wcf后台服务时,参数对象有日期类型得属性,日期默认值不能是datetime.minvalue得值,需要设置大于1971-1-1,不然调不通服务, 第二种情况,服务连通了,并且 ...
- JWT基本概念
json web token 简称 JWT,它并不是一个具体的技术实现,而更像是一种标准. JWT规定了数据传输的结构,一串完整的JWT由三段落组成,每个段落用英文句号连接(.)连接,他们分别是:He ...
- TCP Persist 坚持定时器
1.坚持定时器在接收方通告接收窗口为0,阻止发送端继续发送数据时设定. 由于连接接收端的发送窗口通告不可靠(只有数据才会确认),如果一个确认丢失了,双方就有可能因为等待对方而使连接终止: 接收放等待接 ...
- go语言协程安全map
前言: 在go语言中 map 是很重要的数据结构.Map 是一种无序的键值对的集合.Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值.问题来了,这么安逸的 数据结构 ...
- 基于docker部署ceph以及修改docker image
前言 容器和ceph的结合已经在一些生产环境当中做了尝试,容器的好处就是对运行环境的一个封装,传统的方式是集成为ISO,这个需要一定的维护量,而容器的相关操作会简单很多,也就有了一些尝试,个人觉得如果 ...
- Tarjan算法求割点
(声明:以下图片来源于网络) Tarjan算法求出割点个数 首先来了解什么是连通图 在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点i到顶点j有路径相连(当然从j到i也一定有路径),则称 ...
- 汇编语言常用的DOS功能调用
今天掌握了汇编语言常用的DOS功能调用,现在列出来供参考. 1.单字符输入(1号调用) 格式:MOV AH,1 INT 21H 功能:达到输入状态,从键盘上输入字符的ASCII码送入AX中,并送显示器 ...