项目使用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 ...
随机推荐
- 手把手教你使用rpm部署ceph集群
环境准备 1.在运行 Ceph 守护进程的节点上创建一个普通用户,ceph-deploy 会在节点安装软件包,所以你创建的用户需要无密码 sudo 权限.如果使用root可以忽略. 为赋予用户所有权限 ...
- Electron 的断点续下载
最近用 Electron 做了个壁纸程序,需要断点续下载,在这里记录一下. HTTP断点下载相关的报文 Accept-Ranges 告诉客户端服务器是否支持断点续传,服务器返回 Content-Ran ...
- ServiceStack.Redis 的 ASP.NET Core 扩展库
给大家安利一款 ServiceStack.Redis 的 ASP.NET Core 扩展库,它是基于 ServiceStack.Redis.Core 开发的. 简单易用,开源免费,使用ASP.NET ...
- C# 9.0新特性详解系列之二:扩展方法GetEnumerator支持foreach循环
1.介绍 我们知道,我们要使一个类型支持foreach循环,就需要这个类型满足下面条件之一: 该类型实例如果实现了下列接口中的其中之一: System.Collections.IEnumerable ...
- MySQL 的常用引擎
1. InnoDB InnoDB 的存储文件有两个,后缀名分别是 .frm 和 .idb,其中 .frm 是表的定义文件,而 idb 是数据文件. InnoDB 中存在表锁和行锁,不过行锁是在命中索引 ...
- PHP一些不一样的思路
大多数来自p牛 SQL注入(left join) 源代码 <?php $link = mysqli_connect('localhost', 'root', 'root'); mysqli_se ...
- ppt-1 操作界面与基本操作
1.Ctrl+N快速建立新文档 2.新模板:文件--新建--可免费搜索.下载新模板 3.恢复未保存的演示文稿 文件--打开(首先看到的是近期使用的演示文稿,)--鼠标滚动至末尾,可看到"恢复 ...
- 模拟赛38 B. T形覆盖 大模拟
题目描述 如果玩过俄罗斯方块,应该见过如下图形: 我们称它为一个 \(T\) 形四格拼板 .其中心被标记为\(×\). 小苗画了一个 \(m\) 行 \(n\) 列的长方形网格.行从 \(0\) 至 ...
- leetcode152. 乘积最大子序列
给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数).示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6.示例 2:输入: ...
- Windows10通过NFS挂载linux目录
大致分为以下三大步骤: 一.启动NFS服务器 二.启动NFS客户端 三.挂载NFS目录 工具: win10.虚拟机Ubuntu18.0系统 一. 启动linux的NFS服务端: 以下均为Ubuntu操 ...