碎遮项目的后端异步处理经历了

无处理->多线程/多进程->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队列的思考的更多相关文章

  1. Docker下Python Flask+Redis+MySQL+RQ队列简单配置

    本篇博文主要讲解Docker下使用RQ队列的通信配置,主要是网上的部分文章写的不太清楚,特写一篇 作者使用docker-compose.yml文件调度各部分文件Dockerfile,起初是这样写的 v ...

  2. PMP备考_第五章_项目范围管理_实践思考

    项目范围管理 前言 今天学习项目范围管理的内容,深切的感受到了原单位在项目管理方面存在的问题,今天在这里做一个总结,既相当于对项目范围的一个学习整理,也相当于自己对项目实践过程中存在问题的一个思考. ...

  3. 第十一章 企业项目开发--消息队列activemq

    注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2) 代码的github地址:https://github.com/zhaojigang/ssmm0 消息队列是分布式系统中实现RPC ...

  4. springboot项目 线程消费队列注入报错误空指针

    背景: 在调用阿里云隐私保护有一个通话记录的回执消息是一个消费线程队列,这个还别人告诉我的,因为我根本没有看出来哪里是个线程了,然后我就把它当成普通的代码拿到返回值以后然后插入数据库 可是我这边该加的 ...

  5. 【实战】某项目SQL注入引发的思考

    数据包: 测试参数:username,测试payload: ' ' or '1'='1 ' or '1'='2 响应结果都未发生任何变化,借助sqlmap测试,结果一样: 尝试在or前面进行简单的fu ...

  6. 从壹开始 [ Ids4实战 ] 之五 ║ 多项目集成统一认证中心的思考

    前言 哈喽大家好,好久都没有写文章了,这次又重新开始写技术文章了,半年前我还是一直保持每周都写文章的,后来是为了响应群友的号召,开始踏上了录制视频(https://www.bilibili.com/v ...

  7. Java 小记 — Spring Boot 的实践与思考

    前言 本篇随笔用于记录我在学习 Java 和构建 Spring Boot 项目过程中的一些思考,包含架构.组件和部署方式等.下文仅为概要,待闲时逐一整理为详细文档. 1. 组件 开源社区如火如荼,若在 ...

  8. 【git学习二】git基础之git管理本地项目

    1.背景        git基础打算分两部分来说,一部分是对于本地项目的管理,第二部分是对于远程代码仓库的操作. git运行本地项目管理包含对于相关文件的追踪,暂存区的比較分析,提交,撤销等功能. ...

  9. Redis缓存项目应用架构设计一

    一些项目整理出的项目中引入缓存的架构设计方案,希望能帮助你更好地管理项目缓存,作者水平有限,如有不足还望指点. 一.基础结构介绍 项目中对外提供方法的是CacheProvider和MQProvider ...

随机推荐

  1. Layui弹出层详解

    今天空了学习一下弹出层 还是一步步展示把 首先,layer可以独立使用,也可以通过Layui模块化使用.我个人一直是用的模块化的 所以下面素有的都是基于模块化的. 引入好相关文件就可以开始啦  今天放 ...

  2. SpringBoot实现文件上传功能详解

    目录 利用SpirngBoot实现文件上传功能 零.本篇要点 一.SpringBoot对文件处理相关自动配置 二.处理上传文件MultipartFile接口 三.SpringBoot+Thymelea ...

  3. 2012年游戏软件开发独立本科段01B0815自考科目教材

    代码-----------教材名----------------------------版本----------作者 03708--------中国近现代史纲要----------------高教08 ...

  4. 聊一聊sockmap 以及ebpf

    之前聊过tcpdump 抓包原理,tcpdump使用packet 抓包,使用packet_map 完成零拷贝.但是这个零拷贝也有点假,何为假呢?从网卡到内存走的dma,哪能不能直接从dma拷贝到用户空 ...

  5. phpstudy2016-2018漏洞验证

    影响版本 漏洞验证 查看目录下 php_xmlrpc.dll PHPTutorial\php\php-5.4.45\ext\php_xmlrpc.dll存在@eval(%s('%s'));即说明有后门 ...

  6. Scrum转型(一) 为什么敏捷和Scrum

    1.1 为什么敏捷 由于传统的瀑布模型管理方法无法满足现代某些软件产品开发过程的特点,我们需要使用敏捷的方法(例如,Scrum是一个让我们关注于在短时间里交付高质量商业价值的敏捷框架). 需求频繁变动 ...

  7. ceph各个版本之间参数变化分析

    前言 本篇主要是分析ceph的版本之间参数的变化,参数变化意味着功能的变化,通过参数来分析增加,删除,修改了哪些功能,以及版本之间的变化,本篇主要通过导出参数,然后通过脚本去比对不同的版本的参数变化 ...

  8. RedHat Linux-配置YUM仓库

    范例:配置Yum仓库 Yum软件仓库的作用是为了进一步简化RPM管理软件的难度以及自动分析所需软件包及其依赖关系的技术.可以把Yum想象成是一个硕大的软件仓库,里面保存有几乎所有常用的工具,而且只需要 ...

  9. 每天一个linux命令之stat

    [Linux]Linux下使用stat命令所显示出来的三个时间 转 https://blog.csdn.net/pointer_y/article/details/54347968 在linux系统下 ...

  10. 利用DNS实现SQL注入带外查询(OOB)

    根据用于数据检索的传输信道,SQLi可分为三个独立的类别:inference(经典SQL注入),inband(盲注.推理注入.带内注入)和out-of-band 一.什么是OOB out-of-ban ...