1700509017
12.2.4 压缩问题
1700509018
1700509019
在日志收集中还有一个问题需要考虑,就是数据压缩问题。
1700509020
1700509021
在互联网环境中,带宽的价格是比较昂贵的,如果CPU资源相对过剩,而带宽资源又比较紧张的话,可以考虑压缩后再将数据上传。如果上传的是日志文件,可以直接使用压缩软件或者自己编写的压缩算法进行压缩,然后通过FTP上传。
1700509022
1700509023
如果使用的是单条的日志数据,那么一般只能在自己编写的算法里实现。如果使用Python语言在客户端进行日志收集的话,可选择的库非常丰富。zlib就是Python语言环境中很常用的一个用于压缩和解压缩的库文件。
1700509024
1700509025
下面给出一段使用zlib进行压缩和解压缩的简单语句,由于通常是基于字典压缩,所以重复字符串越长,所占全文比例越大,压缩的效果就越好。凡是基于字典压缩,通常都会有这种经验——文件形式的内容比单条形式的内容压缩率更低,压缩效果更好。这段文字压缩前是228个字符,压缩后仅为26个字符。
1700509026
1700509027
#coding=utf-8import zlibsource=“xxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”compressed=zlib.compress(source)decompressed=zlib.decompress(compressed)
1700509028
1700509029
请注意,这里的压缩一般情况下都是无损压缩,所以压缩的数据肯定不会低于信息论的下界,也就是说,对“稀疏矩阵”的压缩效果尤为明显。我们看到的现象就是,如果文件中有大量重复信息,那么压缩出来的文件就非常小;而如果文件是被压缩过的,例如 .JPG文件、.MPEG文件等,则不管使用什么算法,压缩空间通常都很小。
1700509030
1700509032
12.2.5 连接方式
1700509033
1700509034
在数据采集这个环节,还有一个问题需要讨论,那就是使用短连接还是长连接。这两种方式在互联网的应用中都广泛存在。
1700509035
1700509036
1.短连接
1700509037
1700509038
先说短连接(如图12-6所示)。
1700509039
1700509040
1700509041
1700509042
1700509043
图12-6 三次握手与四次挥手
1700509044
1700509045
在TCP协议栈中,连接的建立有标准的步骤,就是TCP协议栈规定的“三次握手”。这里有两个角色:一个是Server,它是被动方,所做的事情就是启动一个TCP端口的监听;另一个是Client,用于主动向服务方Server发起连接请求。
1700509046
1700509047
(1)当Server接收到Client发来的连接请求(SYN包)后,会回发一个SYN包,表示Server方已经准备好建立连接。
1700509048
1700509049
(2)在Client接收到Server发来的SYN包后,回送给Server端一个ACK包。这样,三次握手就建立了一个五元组连接,在Server端和Client端都会看到一个新五元组的建立。这个所谓的五元组是指“本地IP”、“本地Port”、“远端IP”、“远端Port”、协议类型”的组合,用来描述和管理一个独一无二的连接。有些文章中会使用“源地址”、“远端口”、“目的地址”、“目的端口”这样的说法,意思相同。
1700509050
1700509051
(3)当连接建立以后,Client通常会直接把要传递的数据通过这个五元组描述的连接传输给Server,传输完成后关闭连接。
1700509052
1700509053
关闭的过程叫作“四次挥手”,过程如下。
1700509054
1700509055
(1)Client对服务器发送FIN包,表示Client不再有任何数据要传递给Server。
1700509056
1700509057
(2)Server对Client回复ACK包,表示Server已经收到了Client发来的FIN包,但此时Server还可以通过这个连接向Client发送数据。
1700509058
1700509059
(3)Server对Client回复FIN包,表示Server没有数据要传递给Client了。这个时候,作为线上服务器,Server通常可以在没有收到Client最后发来的FIN包的情况下直接关闭连接,回收连接所占用的内存资源。
1700509060
1700509061
(4)Client对Server回答ACK包,表示Client收到了Server最后发来的FIN包,正式关闭连接。
1700509062
1700509063
之所以称为短连接,是因为这样的过程耗时极短。通常在手机、PC终端发起一次HTTP请求,报送数据的量以几百字节(B)到几十千字节(KB)居多,所以,从建立连接,到发送数据,再到连接断开,大概要经历几十毫秒到几秒不等,主要开销是在网络上传输的延迟。这种短连接的报送方式最为普遍,网页上常用的GET方式和POST方式的请求就属于短连接。这种连接适用于高并发的短小访问,例如单条日志的报送。
1700509064
1700509065
2.长连接
[
上一页 ]
[ :1.700509016e+09 ]
[
下一页 ]