开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop框架搭建):数据采集-服务器保护机制】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/670/detail/11618
数据采集-服务器保护机制
内容简介:
一、增加服务器保护机制功能
二、代码实现
一、增加服务器保护机制功能
1、思路分析
上节脚本虽然写完了,但是还稍微差一点,即需要集群,现在虽然数据已经能够采集到数据,并且已经发送到后台,但是现在里面缺少一点内容-一个保护机制,打开脚本当中第一部分中写到缺少一个保护机制,到脚本当中来看,里面是直接就导入,然后开始准备采集数据,这有什么问题?
现在假设一个官网:
去哪儿或携程或东方,它们在采集数据时,服务器的处理能力是有限的,假设这个服务器里面最多只能允许1050个用户来同时访问,即最多只能允许1050个人同时在线,那如果当前活跃的用户中已经连接的用户已经达到1000了,系统马上就要崩溃了,且对于用户的普通查询已经有了很大的性能影响时,这种时候就不采集数据了,这种时候正常用户的查询服务都已经很困难了,就不需要采集数据了,所以要在其里面加一个保护机制,假如当最大能够接受的用户数是1050个,这时肯定不能到1050才停止,再假设能接受的最大限度是1000,如果当前活跃的用户连接数小于1000时采集数据,大于1000时就停止采集数据,这种时候系统正常运行都已经成问题,根本没有必要再去采集数据,所以要加一个保护机制。
2、增加保护机制代码
这个保护机制是什么?这时要加一个判断,要查出当前活跃用户连接数是多少,然后与设置的阈值的关系,假设这里设置1050是最上限,而最高能的让它查1000个用户,其中1000就是预知要去判断当前活跃用户数与阈值的大小关系,活跃的用户连接数小于1000时,才让采集数据;如果大于1000,就不采集数据了。
怎么做此功能?打开脚本,输入以下代码:
--开启服务器的保护机制(当前活跃用户连接数小于1000时采集数据,大于1000就不采集数据)
--最大的用户数阈值
local maxUserNumber=1000
--获取当前活跃用户连接数
local activeUserNumber=ngx.var.connections_active
3、保护机制代码说明
首先要定义一个当前活跃用户连接数的阈值,其中默认声明了一个本地的 maxUserNumber 最大是1000个,然后接下来再获取当前活跃的用户的连接数,那么当前活跃用户是怎么获取的,首先来定义一下,这里 activeUserNumber 就是定义的当前变量,通过 ngx 来进行获取,这里 ngx 里面提供了一个方法,这个方法返回的结果就是此时此刻已经连接的用户连接数,无需自己去计算,它自己返回的结果就是 ngx.var.connections_active ,以上就是获取当前活跃用户的连接数。
4、判断功能
获取完成之后开始比较大小,如果当前活跃用户人数小于1000,再去进行处理(即再去进行采集),如果大于1000就不采集了,代码如下:
if activeUserNumber<maxUserNumber
then
如果当前的 activeUserNumber (活跃用户连接数)小于 maxUserNumber (最大的用户连接数)时,再进行采集,那么 then 是直接就可以拉到最后的,例如”900“,900是小于1000的,小于1000就需要去采集,否则如果大于1000就不采集,有 then 就有 end ,end 放入代码的最后一部分,其中 end 是结束,开始在 then 这里,这就是上述代码。在上文代码中 maxUserNumber 是一个 number 类型,所以为了更保险把它们都做成一个 tonumber 形式,
如下所示:
if tonumber(activeUserNumber)<tonumber(maxUserNumber)
then
二、代码实现
这样保护机制就做完了:如果当前活跃用户连接数小于1000就采集,大于1000便预示马上到峰值了,于是采用了一个保护机制,而且当前活跃用户连接数,在后面的程序开发时也是必须要用到的,所以在此一举两得把它做出来,将以上代码进行保存,保存完成之后再把它进行上传,在此之前输入 rm-rf 把上节脚本中的内容进行删除,删除之后再把它上传到集群里面,上传完成之后重启 nginx ,
代码显示如下:
可以看到上述代码中并没有报错,然后再回到之前的窗口中去刷界面,这个没有效果可看,如果数据能正常打进来,就说明刚才写的内容是没有错的,如果打不进去再解决问题,页面刷新之后可以看到数据是可以正常打进来的,
如下图所示:
这就表明添加的保护机制逻辑是没有问题的,到现在数据采集的脚本代码就彻底的结束了。