RequestQueue

scrapy和scrapy-redis的区别

血红的双手。 提交于 2021-02-08 23:03:55
scrapy是一个python爬虫框架,爬取的效率极高,具有高度的定制性,但是不支持分布式。而scrapy-redis是一套基于redis库,运行在scrapy框架之上的组件,可以让scapy支持分布式策略 Slaver端共享Master端redis数据库里的item 队列、请求队列和请求指纹集合。 选择redis数据库的原因:   redis支持主从同步,而且数据都是缓存在内存中的,所以基于redis的分布式爬虫,对请求和数据的高频率读取效率都非常高     scrapy-redis和scrapy的关系就像电脑和固态硬盘一样,是电脑中的一个插件,能让电脑更快的运行     scrapy是一个爬虫框架,scrapy-redis则是这个框架上可以选择的插件,它可以让爬虫跑得更 解释说明: 从优先级队列中获取requests对象,交给engine engine将requests对此昂交给下载器下载,期间会通过downlomiddleware的process_request方法 下载器完成下载,获得response对象,将该对象交给engine,期间会经过downloadmiddleware的process_response()方法 engine将获得的response对象交给spider进行解析,期间会经过spidermiddleware的process_spider_input(

秒杀系统架构分析与实战

那年仲夏 提交于 2021-02-01 02:56:16
互联网正在高速发展,使用互联网服务的用户越多,高并发的场景也变得越来越多。电商秒杀和抢购,是两个比较典型的互联网高并发场景。虽然我们解决问题的具体技术方案可能千差万别,但是遇到的挑战却是相似的,因此解决问题的思路也异曲同工。、 1 秒杀业务分析 正常电子商务流程 (1)查询商品;(2)创建订单;(3)扣减库存;(4)更新订单;(5)付款;(6)卖家发货 秒杀业务的特性 (1)低廉价格;(2)大幅推广;(3)瞬时售空;(4)一般是定时上架;(5)时间短、瞬时并发量高; 2 秒杀技术挑战 假设某网站秒杀活动只推出一件商品,预计会吸引1万人参加活动,也就说最大并发请求数是10000,秒杀系统需要面对的技术挑战有: 对现有网站业务造成冲击 秒杀活动只是网站营销的一个附加活动,这个活动具有时间短,并发访问量大的特点,如果和网站原有应用部署在一起,必然会对现有业务造成冲击,稍有不慎可能导致整个网站瘫痪。 解决方案 :将秒杀系统独立部署,甚至 使用独立域名,使其与网站完全隔离 。 高并发下的应用、数据库负载 用户在秒杀开始前,通过不停刷新浏览器页面以保证不会错过秒杀,这些请求如果按照一般的网站应用架构,访问应用服务器、连接数据库,会对应用服务器和数据库服务器造成负载压力。 解决方案 :重新设计秒杀商品页面,不使用网站原来的商品详细页面, 页面内容静态化,用户请求不需要经过应用服务 。

redis系列之数据库与缓存数据一致性解决方案

倾然丶 夕夏残阳落幕 提交于 2020-11-04 05:11:29
redis系列之数据库与缓存数据一致性解决方案 数据库与缓存读写模式策略 写完数据库后是否需要马上更新缓存还是直接删除缓存? (1)、如果写数据库的值与更新到缓存值是一样的,不需要经过任何的计算,可以马上更新缓存,但是如果对于那种写数据频繁而读数据少的场景并不合适这种解决方案,因为也许还没有查询就被删除或修改了,这样会浪费时间和资源 (2)、如果写数据库的值与更新缓存的值不一致,写入缓存中的数据需要经过几个表的关联计算后得到的结果插入缓存中,那就没有必要马上更新缓存,只有删除缓存即可,等到查询的时候在去把计算后得到的结果插入到缓存中即可。 所以一般的策略是当更新数据时,先删除缓存数据,然后更新数据库,而不是更新缓存,等要查询的时候才把最新的数据更新到缓存 数据库与缓存双写情况下导致数据不一致问题 场景一 当更新数据时,如更新某商品的库存,当前商品的库存是100,现在要更新为99,先更新数据库更改成99,然后删除缓存,发现删除缓存失败了,这意味着数据库存的是99,而缓存是100,这导致数据库和缓存不一致。 场景一解决方案 这种情况应该是先删除缓存,然后在更新数据库,如果删除缓存失败,那就不要更新数据库,如果说删除缓存成功,而更新数据库失败,那查询的时候只是从数据库里查了旧的数据而已,这样就能保持数据库与缓存的一致性。 场景二 在高并发的情况下,如果当删除完缓存的时候,这时去更新数据库

Kafka网络模型

跟風遠走 提交于 2020-10-28 12:59:21
Kafka网络模型 摘要:很多人喜欢把RocketMQ与 Kafka 做对比,其实这两款消息队列的网络通信层还是比较相似的,本文就为大家简要地介绍下Kafka的NIO网络通信模型,通过对Kafka源码的分析来简述其Reactor的多线程网络通信模型和总体框架结构,同时简要介绍Kafka网络通信层的设计与具体实现。 一、Kafka网络通信模型的整体框架概述 Kafka的网络通信模型是基于NIO的Reactor多线程模型来设计的。这里先引用Kafka源码中注释的一段话: 相信大家看了上面的这段引文注释后,大致可以了解到Kafka的网络通信层模型,主要采用了 1(1个Acceptor线程)+N(N个Processor线程)+M(M个业务处理线程) 。下面的表格简要的列举了下(这里先简单的看下后面还会详细说明): 线程数线程名线程具体说明1kafka-socket-acceptor_%xAcceptor线程,负责监听Client端发起的请求Nkafka-network-thread_%dProcessor线程,负责对Socket进行读写Mkafka-request-handler-_%dWorker线程,处理具体的业务逻辑并生成Response返回 Kafka网络通信层的完整框架图如下图所示: Kafka消息队列的通信层模型—1+N+M模型.png

iOS之深入剖析YYImage的图片处理原理

眉间皱痕 提交于 2020-08-05 13:23:16
YYImage的使用 特性 支持 WebP、APNG、GIF 类型动画图像的 播放/编码/解码 ; 支持 WebP、PNG、GIF、JPEG、JP2、TIFF、BMP、ICO、ICNS 类型静态图像的 显示/编码/解码 ; 支持 PNG、GIF、JPEG、BMP 类型图片的 渐进式/逐行扫描/隔行扫描解码 ; 支持多张图片构成的帧动画播放,支持单张图片的 sprite sheet 动画 ; 高效的 动态内存缓存管理 ,以保证高性能低内存的动画播放; 完全兼容 UIImage 和 UIImageView,使用方便; 保留 可扩展的接口 ,以支持自定义动画; 每个类和方法都有完善的文档注释。 基本用法 显示动画类型图片 UIImage * image = [ YYImage imageNamed : @"animation.gif" ] ; UIImageView * imageView = [ [ YYAnimatedImageView alloc ] initWithImage : image ] ; [ self . view addSubview : imageView ] ; 播放帧动画 // frame1.png, frame2.png, frame3.png三张图片 NSArray * paths = @ [ @"/ani/frame1.png" , @"/ani

Linux Block子系统——IO调度层

徘徊边缘 提交于 2020-05-09 21:43:14
概述 本文主要来讨论Linux Block子系统中的IO调度层。我们知道应用层发起磁盘数据访问时内核并不会立即将请求下发到磁盘的驱动程序中进行响应,而是做适当的延迟,尝试能否扩展之前请求的磁盘范围来满足该请求。这样做的好处也很明显,以机械硬盘为例,访问不同位置的数据是通过磁头的移动实现的,如果下发给驱动程序的请求是按照磁头移动的方向进行了排序,那么磁盘只需要按照特定的方向连续的访问数据即可响应这些请求,节省了磁头移动定位的时间。对IO请求进行排序和并就是IO调度层的主要工作,由于这种机制很像我们显示生活中的电梯(只朝着一个方向运行),因此IO调度层所使用的算法也被统称为电梯调度算法。 数据结构 IO调度层涉及到的数据结构主要为两种,request表示IO请求,由通用块层的bio初始化或者合并得到;request_queue表示请求队列,包含了对一个块设备的所有request。下面我们来看一下这两种数据结构中主要的成员。 struct request { #ifdef __GENKSYMS__ union { struct list_head queuelist; struct llist_node ll_list; }; #else struct list_head queuelist; #endif union { struct call_single_data csd; RH

linux io的cfq代码理解一

一笑奈何 提交于 2020-05-09 21:41:52
内核版本: 3.10内核。 CFQ,即Completely Fair Queueing绝对公平调度器,原理是基于时间片的角度去保证公平,其实如果一台设备既有单队列,又有多队列,既有快速的NVME,又有慢速的sas,各个磁盘都配置为CFQ的话,那么这个Completely Fair 明显无法保证,可能会演变为Completely unFair 。所以nvme的盘,一般使用的是noop策略,因为一定时间之内的io,可能会下发很多给快速设备,也可能下发很少给慢速设备,这样就无公平可言了,吞吐量也不行。 IO调度的原理: 看到io调度的时候,一定要想为什么需要io调度,调度其实就是封装一层,管理下发的io request,由于存储介质不同,需要的调度算法肯定也不一样,IO调度就是在实时性和io吞吐上的一个折中,不管采用什么的调度算法,调度的目的是明确的,就是通过 io的合并或者重排 ,提高硬件设备的性能,不管是虚拟的硬件设备还是实际的硬件设备。 单队列和多队列 和网卡的发展一样,硬盘设备也有单队列和多队列的区别,单队列有一个明显的弱点,就是所有的io都最终汇聚到一个队列,这个面对目前多核的设备,性能很难发挥。 优先级: 每个进程都会有IO优先级,这个和进程的调度优先级类似。CFQ调度器将会将其作为考虑的因素之一,来确定该进程(或者说cggroup进程组)的请求队列何时可以获取块设备的使用权

老白学编程

给你一囗甜甜゛ 提交于 2020-04-30 19:39:21
存储相关的Metrics disk /proc/diskstats $ cat /proc/diskstats 8 0 sda 19845 144 2468979 81307 5380 1084 181174 47385 0 19839 128640 8 1 sda1 168 0 48862 7580 10 0 4136 192 0 1151 7772 8 2 sda2 19612 144 2416997 73544 4757 1084 177038 44181 0 18997 117673 11 0 sr0 0 0 0 0 0 0 0 0 0 0 0 253 0 dm-0 19443 0 2407493 73345 5693 0 175134 58916 0 19577 132260 253 1 dm-1 206 0 7024 393 238 0 1904 8073 0 1385 8466 前3项是主设备号,次设备号和设备名称。 后面11个域的描述如下: Name units description ---- ----- ----------- read I/Os requests 完成的读请求次数 read merges requests 在IO队列中合并的IO次数,对于机械盘来讲,IO合并对性能帮助太大了, innodb设计中change buffer,double

重大更新!Druid 0.18.0 发布—Join登场,支持Java11

懵懂的女人 提交于 2020-04-28 20:42:06
Apache Druid本质就是一个分布式支持实时数据分析的数据存储系统。 能够快速的实现查询与数据分析,高可用,高扩展能力。 距离上一次更新刚过了二十多天,距离0.17版本刚过了三个多月,Druid再次迎来重大更新,Druid也越来越强大了。 Apache Druid 0.18.0 本次更新了 42位贡献者的200多个新功能,性能增强,BUG修复以及文档改进。 新功能 Join支持 Join是数据分析中的关键操作。在0.18.0之前,Druid支持一些与Join有关的功能,例如SQL中的Lookups或半联接。但是,这些功能的用例非常有限,对于其他联接用例,用户在摄取数据时必须对数据源进行规范化,而不是在查询时将其加入,这可能导致数据量激增和摄取时间延长。 Druid 0.18.0有史以来第一次支持真正的Join,Druid 目前支持INNER,LEFT和CROSS的join。对于原生查询, join 作为新的数据源被引入,以表示两个数据源的Join。 当前,仅允许 left-deep join。这意味着左侧数据源仅允许一个 table 或另一个 join 数据源。对于右侧的数据源, lookup , inline ,或者 query 数据源是允许的。 Druid SQL也支持Join了!其实本质上是SQL JOIN查询被转换为一个或几个包含原生查询。 Join会影响查询的性能

OO UNIT 2 个人总结

末鹿安然 提交于 2020-04-17 10:45:19
【推荐阅读】微服务还能火多久?>>> 第二单元面向对象作业——性感电梯在线吃人 Part 1:单部可捎带电梯 多线程设计策略 本次电梯仅仅只有一部运行,因此,在多线程的设计中难度不大,并且,只需采用一对一的生产者-消费者模型即可解决问题。整体的设计大致为:输入线程作为生产者不断接受外部请求并投入托盘容器中;调度器线程起到了托盘容器的作用,并在电梯运行中辅助实现可捎带功能;电梯线程为消费者,接受乘客的请求,并不断计算目标地点和进行自身移动的处理。 在实现中,为了使电梯线程能够正确结束,在输入线程结束前夕,要对电梯线程发送状态信息,在电梯无任何需要处理的工作后,若检测到输入线程已结束运行,则结束自身生命,随之,调度器这个守护线程也一并结束。 三个线程的主要共享资源为请求等待队列的一个LinkedList容器,简单的对他上锁,即可保证基本的线程安全。而输入和电梯之间的一个信号传递,也是依靠共享资源进行的,这里需要注意的是: while (persons.isEmpty() && queue.isEmpty()) { if (queue.getNoMoreReq()) { return; } synchronized (queue) { try { queue.wait(); } catch (InterruptedException e) { e.printStackTrace(); }