科技网

当前位置: 首页 >VR

网站数据分析网站分析我们的数据准确吗

VR
来源: 作者: 2019-05-17 14:18:00

1 : 网站分析——我们的数据准确吗?

【导言】在做网站分析的漫长历程中,被问到最多的问题就是“你的数据精确吗?”网站分析的数据究竟准确与否,如何看待网站分析数据可能存在的偏差,本文将会给出答案。

【正文】

准确和精确在汉语里面是近义词,我们在口语中是可以混用的,英语中也如此,accurate和precise人们也是随性而用,脱口而出。可是,既然有两个词存在,而没有在文字演变的长河中灭亡其中1个,就说明它们还是有奥妙的不同。事实上,准确和精确绝对不是同1个概念,它们在工程学、统计学和其他许许多多的科学中都被严格的辨别,对网站分析这么新兴的学科而言,也完全如此。

我们先看看准确和精确到底有甚么不同,然后再看看网站分析工具能够做到准确还是精确,或是2者皆备。

———————快乐的分页符———————

作甚准确,作甚精确

维基百科上有关于准确和精确的极佳的解释,可谓经典词条。这里我用汉语向它致敬:准确是指现象或丈量值相对事实之间的离散程度小,也就是我们口语的“接近事实、符合事实”等;精确是指在条件不变的情况下,现象或丈量值能够低离散程度的反复再现,也就是我们口语说的“次次如此、回回1样”等。下面这两个图特别经典,从维基百科援用而来:

图1:这是指相对较高的准确度,但相对较低的精确度

图2:这是指相对较高的精确度,但相对较低的准确度

上面的两个图中红色的圆心代表着事实。可以看到,在图1中,丈量值围绕着圆心,虽然散布离散,但可以看出它们的平均散布位置肯定在圆心中(或说,屡次丈量值的平均值是符合事实的),所以可以称为准确,但因结果离散而不能称为精确。在图2中,丈量值明显偏离圆心(丈量值的平均值也不可能在圆心上),所以不能称为准确,但可以称为精确,由于丈量值的复现离散度很低。这是对准确和精确的极好解释。

如果我们把准确和精确作为两个不同的维度建立矩阵,可以得到下面的图:

图3:准确和精确矩阵(图片来源:www.wellesley.edu)

左上象限是我们最喜欢的,既准确,且精确——对物理学和绝大多数理工科的要求就是如此;右下角是最糟的情况,不但不精确,而且不准确——这是生活中最多见的,我们的社会生活其实很离散也很浑沌。

那末,自但是然的你会问,网站分析属于哪一个象限呢?1定是左上角的象限对吗?

网站分析是准确的吗?

首先,这个问题没有固定的答案,由于网站分析的准确度很大程度上取决于你的期望和所采取的监测方法和所使用的工具。不过,就我们最常使用的网站分析方法而言,网站分析绝对不属于图3中左侧的两个象限(即不属于既准确又精确的象限,也不属于准确但不精确的象限),更简单说,就是网站分析的数据不会准确。

这可能会让你失望,但相信其实不出乎你的意料。你肯定已发现,如果我们使用不同的网站分析工具衡量同1个网站的时候,各工具的结果之间有使人费解的差异(我们在为何两个监测工具报告中的数据不同有探讨个中缘由),而且我们也没法知道哪一个工具是更准确的还原了事实上的数据。

所以,如果GA显示你的网站在1个月内有36,954个Unique Visitor,你的网站的真实访问者(1个个活生生的网友!)肯定不是36,954个!

事实上,我们几近找不出来任何1个能够准确被统计的度量,即便是最基本最简单的度量——Page View也是如此!

因此,如果你的老板想要100%没有误差地知道网站到底有多少个人访问过,这个想要本身已没成心义。

为何网站分析数据没法准确

你可能会吃惊,由于我们的物理学实际上也是不可能100%准确的,缘由是我们都听说过的“测不准原理”。一样,网站分析也由于1个最基本的事实而没法准确,即:网站分析的监测媒介是阅读器和服务器,而不是真实的人,这注定了我们不可能寻求到准确的结果。

具体而言,就目前我们通常使用的两种监测方法——Server Log和Page Tag都不可能准确对网站分析的1些最基本度量进行计数。

Server Log的误差(Bias):

Unique Visitor的误差:

如果用Server Log的方法监测数据,那末很明显,获得真实的访问者数量是不可能的任务。本身Server Log对访问者的估算只能根据误差巨大IP,而网络爬虫/机器人的访问又使这类误差进1步扩大。

Page View的误差:

本来Server Log是可以很准确的记录Page View的,但是惋惜Cache的出现让这成为历史。Cache极有可能会屏蔽服务器真个响应,这样Server Log可能不会留下任何关于某次Page View记录。

时间记录的误差:

在没有Cache干扰的情况下,服务器能准确探知访问开始的时间,但是访问结束的时间没法了解。由于访问结束常常是随关闭阅读器而1同结束的。关闭阅读器本身不能激起1条新的Server Log记录。

Flash站点误差:

如果1个网站主要构成部份是包括多个页面的1个Flash文件,或多个此类Flash文件的组合,那末Server Log不会记录Flash内部的操作,监测会几近失效。

Page Tag的误差:

Page Tag失效:

Page Tag失效是会产生的。首先,1部份阅读器(例如手机上的1些阅读器)不支持JavaScript或被设置为JavaScript制止。其次,Page Tag可能会由于它之前的JavaScript出错而没法运行。再次,我们也看到过由于变量名冲突而产生Page Tag和页面上其他JavaScript冲突而没法运行的案例。最后,受网络速度的影响,页面上的Page Tag没有完全下载,阅读器便可能被人为关闭或直接链向1个新的页面。

明显,如果Page Tag失效,那末网站分析工具就会失去部份或全部数据。

Page Tag的位置:

Page Tag在页面中的位置会影响网站分析工具的计数。如果Page Tag在页面的上端,那末它会更快的被履行,遭到其他因素(例如Page Tag之前其他JavaScript失效或网速问题)干扰的情况就越小,计数也就会因此增大。Stone Temple Consulting的统计表明,代码在上的情况下,Visitor计数比在页面下的多4.3%。

Unique Visitor的误差:

1个计算机可能被多人使用;1个计算机可能有多个阅读器(造成访问同1个网站有多个Cookie);人们会删除Cookie(2007年comScore的统计表明,1个月内有30%的美国用户会删除阅读器的Cookie);Cookie被禁用(虽然WA工具1般都使用第1方Cookie,但仍有约10%不到的第1方Cookie会被用户设为制止)。

Page View的误差:主要由Page Tag失效引发。

时间记录的误差:同Server Log1样,Page Tag能够准确记录访问开始的时间,但是结束时间没法了解,由于1般情况下访问的结束其实不会触发Page Tag的履行。

由于诸如Page View,访问者和访问时间之类的基本的度量实际上是没法准确记录的,由于其他1些更高级的度量,例如我们经常使用的复合度量(Bounce Rate,Avg. Time on Site)就更不可能准确了。不过,知道了这些误差产生的缘由,有助于我们进1步修正误差。有些监测工具(例如DoubleClick,1个广告监测工具)具有自修正功能,就是利用了这个原理。

其他监测方法的误差:

网站分析的其他获得数据的方式——比如通过客户真个软件搜集数据(Alexa,iResearch等),和Sniffer(包嗅探)——则因其本身的监测方式所限,会有更大的误差。例如,通过客户端来搜集数据,很明显存在样本量的偏差;而Sniffer本质上是Server Log方式的翻版,但却增加了包丢失和数据记录有限的问题。它们不可能比我们前面的两种方法更准确。

网站分析工具精确吗?

现在,你知道了网站分析工具其实不能准确计数。那末,网站分析工具精确吗?

我要说,精确是网站分析工具的必备特点,网站分析工具做不到准确,但必须精确。如果某个网站分析工具不精确,那末它就与垃圾无异。

网站分析工具必须精确的缘由很简单,由于我们需要数据具有高度的1致性。如图4(下图)所示,如果网站分析工具的精确度存在⑵0%到+20%的误差,那末假定11月4日的网站准确流量是50个UV,网站分析工具所报告的数值多是40和60之间的任何1个数。一样,我们假定第二天(11月5日)的网站准确流量是51个UV,那末网站分析工具所报告的数值多是41到61之间的任何数。那末,由于存在不精确,那末11月4日的数据有可能终究显现40,而11月5日的数据则完全可能被终究显现为61,这样网站分析工具会误报出1个使人满意的增长——但事实上这个增长其实不存在。反过来,如果11月4日的数据被报为60,而第二天被报为41,那末更糟,这与实际情况是完全相反的。

图4:如果网站分析工具不精确会产生严重后果

因此网站分析工具必须精确,如果它与事实有⑵0%的误差,那末不论是哪1天哪1刻,它都必须比准确值小20%。否则我们就会得到毛病的结论。固然,100%的精确也是不存在的,1般而言,允许+/⑸%左右的系统偏差,这1来1去其实已有最大10%的分离度,实际上已是非常宽的标准了。

网站分析工具不能做到100%精确的缘由其实也是受跟上1节的那些因素1样的影响,另外还有1些网站访问者所处环境的变化酿成的未知异常,例如网络带宽的变化或是数据传输进程中的异常丢失等。

那末,我们实际使用的网站分析工具精确度如何?如果5颗星是满分最精确的话,那末:

Google Analytics,精确度3颗半星,可和格。但是我们的朋友Ben(曾海银)和我都发现Google Analytics其实不完全精确,这可能与数据的再处理有关系。Ben的案例中出现了+/⑵0%的情况,但极其罕见。其他的朋友有发现吗?

Omniture,精确度4颗星,较好。固然,我没有办法去验证,只是由于他们家的数据比较少给我惹麻烦,也比较少有没有法解释的时候。但是Omniture的问题在于,定义的度量太多,且相同度量的定义在不同场合给出的数值不完全1致——实在是1个太庞大的数据系统了。

[版权归作者Sidney Song(宋星)所有,欢迎转载,但请事前告知作者并注明出处]

WebTrends,4颗半星。评分较高的缘由在于WebTrends是实行在网站服务器端,或是被网站所有者所具有的,所以被外界环境干扰的情况相对较少。这是1个先天优势,无庸置疑。

如何面对网站分析工具的不准确但精确的特性?

网站分析工具不准确但精确的特性无妨碍我们取得真实的insight(见解)。我们需要遵守3个网站分析的基本原则(简直是我压箱子底的宝贝了):

原则1:趋势。

看趋势而不是看孤立数据是网站分析最重要的原则。你不可能由于网站今天的流量是500个而狂喜,但是如果上个月的平均流量是300,而这个月的平均流量是500,那末我会恭喜你,你也值得高兴1番。我们在之前的文章中对这个有讨论哦。

由于网站分析工具是精确的,因此虽然不能准确反应数据,却能够准确反应趋势。这也是我们所有的网站分析师会认为趋势是最重要的方法论的缘由。

原则2:细分。

由于网站分析工具的精确性,如果整体值比实际准确值偏小20%的话,那末构成整体的各部份也会同比比各自的准确值偏小20%。因此,比较所需要的细分依然能够满足分析的需要。

原则3:转化。

与细分类似,精确性能够保证转化是同比放大或缩小,因此转化本身的比例是准确的。

如此看来,我们最后要得出的结论是:真正帮助我们进行网站分析的关键方法所需要的数据是准确的。因此,当我们理解并且学会应用网站分析的3原则以后,我们会把网站分析工具所在的象限转移到左上角的象限——即既准确且精确。真的,网站分析工具终究准确与否,在于你是不是用好了它,这是唯心的结论,但确切是真实的真相。

祝大家好运。

[版权归作者Sidney Song(宋星)所有,欢迎转载,但请事前告知作者并注明出处]

原文地址:http://www.chinawebanalytics.cn/?p=1345

有甚么看法和建议吗?非常欢迎大家留言。看到大家的留言是最快乐的,也是终究自我满足的回报。:)

2 : 解析网站处理数据交换时的序列化和反序列化

#摘要

序列化和反序列化几近是工程师们每天都要面对的事情,但是要精确掌握这两个概念其实不容易:1方面,它们常常作为框架的1部份出现而湮没在框架当中;另外一方面,它们会以其他更容易理解的概念出现,例如加密、持久化。但是,序列化和反序列化的选型却是系统设计或重构1个重要的环节,在散布式、大数据量系统设计里面更加显著。恰当的序列化协议不但可以提高系统的通用性、强健性、安全性、优化系统性能,而且会让系统更加易于调试、便于扩大。本文从多个角度去分析和讲授“序列化和反序列化”,并对照了当前流行的几种序列化协议,期望对读者做序列化选型有所帮助。

简介

文章作者服务于美团推荐与个性化组,该组致力于为美团用户提供每天billion级别的高质量个性化推荐和排序服务。从Terabyte级别的用户行动数据,到Gigabyte级别的Deal/Poi数据;从对实时性要求毫秒之内的用户实时地理位置数据,到定期后台job数据,推荐与重排序系统需要多种类型的数据服务。推荐与重排序系统客户包括各种内部服务、美团客户端、美团网站。为了提供高质量的数据服务,为了实现与上下游各系统进行良好的对接,序列化和反序列化的选型常常是我们做系统设计的1个重要斟酌因素。

本文内容按以下方式组织:

第1部份给出了序列化和反序列化的定义,和其在通讯协议中所处的位置。

第2部份从使用者的角度探讨了序列化协议的1些特性。

第3部份描写在具体的实行进程中典型的序列化组件,并与数据库组建进行了类比。

第4部份分别讲授了目前常见的几种序列化协议的特性,利用场景,并对相干组件进行举例。

最后1部份,基于各种协议的特性,和相干benchmark数据,给出了作者的技术选型建议。

#1、定义和相干概念

互联网的产生带来了机器间通讯的需求,而互联通讯的双方需要采取约定的协议,序列化和反序列化属于通讯协议的1部份。通讯协议常常采取分层模型,不同模型每层的功能定义和颗粒度不同,例如:TCP/IP协议是1个4层协议,而OSI模型却是7层协议模型。在OSI7层协议模型中展现层(Presentation Layer)的主要功能是把利用层的对象转换成1段连续的2进制串,或反过来,把2进制串转换成利用层的对象--这两个功能就是序列化和反序列化。1般而言,TCP/IP协议的利用层对应与OSI7层协议模型的利用层,展现层和会话层,所以序列化协议属于TCP/IP协议利用层的1部份。本文对序列化协议的讲授主要基于OSI7层协议模型。

序列化: 将数据结构或对象转换成2进制串的进程

反序列化:将在序列化进程中所生成的2进制串转换成数据结构或对象的进程

数据结构、对象与2进制串

不同的计算机语言中,数据结构,对象和2进制串的表示方式其实不相同。

数据结构和对象:对类似Java这类完全面向对象的语言,工程师所操作的1切都是对象(Object),来自于类的实例化。在Java语言中最接近数据结构的概念,就是POJO(Plain Old Java Object)或Javabean--那些只有setter/getter方法的类。而在C++这类半面向对象的语言中,数据结构和struct对应,对象和class对应。

2进制串:序列化所生成的2进制串指的是存储在内存中的1块数据。C++语言具有内存操作符,所以2进制串的概念容易理解,例如,C++语言的字符串可以直接被传输层使用,由于其本质上就是以''结尾的存储在内存中的2进制串。在Java语言里面,2进制串的概念容易和String混淆。实际上String 是Java的1等公民,是1种特殊对象(Object)。对跨语言间的通讯,序列化后的数据固然不能是某种语言的特殊数据类型。2进制串在Java里面所指的是byte[],byte是Java的8中原生数据类型之1(Primitive data types)。

#2、序列化协议特性

每种序列化协议都有优点和缺点,它们在设计之初有自己独特的利用场景。在系统设计的进程中,需要斟酌序列化需求的各个方面,综合对照各种序列化协议的特性,终究给出1个折衷的方案。

通用性

通用性有两个层面的意义:

第1、技术层面,序列化协议是不是支持跨平台、跨语言。如果不支持,在技术层面上的通用性就大大下降了。

第2、流行程度,序列化和反序列化需要多方参与,很少人使用的协议常常意味着昂贵的学习本钱;另外一方面,流行度低的协议,常常缺少稳定而成熟的跨语言、跨平台的公共包。

强健性/鲁棒性

以下两个方面的缘由会致使协议不够强健:

第1、成熟度不够,1个协议从制定到实行,到最后成熟常常是1个漫长的阶段。协议的强健性依赖于大量而全面的测试,对致力于提供高质量服务的系统,采取处于测试阶段的序列化协议会带来很高的风险。

第2、语言/平台的不公平性。为了支持跨语言、跨平台的功能,序列化协议的制定者需要做大量的工作;但是,当所支持的语言或平台之间存在难以调和的特性的时候,协议制定者需要做1个艰巨的决定--支持更多人使用的语言/平台,亦或支持更多的语言/平台而放弃某个特性。当协议的制定者决定为某种语言或平台提供更多支持的时候,对使用者而言,协议的强健性就被牺牲了。

可调试性/可读性

序列化和反序列化的数据正确性和业务正确性的调试常常需要很长的时间,良好的调试机制会大大提高开发效力。序列化后的2进制串常常不具有人眼可读性,为了验证序列化结果的正确性,写入方不得同时撰写反序列化程序,或提供1个查询平台--这比较费时;另外一方面,如果读取方未能成功实现反序列化,这将给问题查找带来了很大的挑战--难以定位是由于本身的反序列化程序的bug所致使还是由于写入方序列化后的毛病数据所致使。对跨公司间的调试,由于以下缘由,问题会显得更严重:

第1、支持不到位,跨公司调试在问题出现后可能得不到及时的支持,这大大延长了调试周期。

第2、访问限制,调试阶段的查询平台未必对外公然,这增加了读取方的验证难度。

如果序列化后的数据人眼可读,这将大大提高调试效力, XML和JSON就具有人眼可读的优点。

性能

性能包括两个方面,时间复杂度和空间复杂度:

第1、空间开消(Verbosity), 序列化需要在原本的数据上加上描写字段,以为反序列化解析之用。如果序列化进程引入的额外开消太高,可能会致使过大的网络,磁盘等各方面的压力。对海量散布式存储系统,数据量常常以TB为单位,巨大的的额外空间开消意味着高昂的本钱。

第2、时间开消(Complexity),复杂的序列化协议会致使较长的解析时间,这可能会使得序列化和反序列化阶段成为全部系统的瓶颈。

可扩大性/兼容性

移动互联时期,业务系统需求的更新周期变得更快,新的需求不断出现,而老的系统还是需要继续保护。如果序列化协议具有良好的可扩大性,支持自动增加新的业务字段,而不影响老的服务,这将大大提供系统的灵活度。

安全性/访问限制

在序列化选型的进程中,安全性的斟酌常常产生在跨局域网访问的场景。当通讯产生在公司之间或跨机房的时候,出于安全的斟酌,对跨局域网的访问常常被限制为基于HTTP/HTTPS的80和443端口。如果使用的序列化协议没有兼容而成熟的HTTP传输层框架支持,可能会致使以下3种结果之1:

第1、由于访问限制而下降服务可用性。

第2、被迫重新实现安全协议而致使实行本钱大大提高。

第3、开放更多的防火墙端口和协议访问,而牺牲安全性。

#3、序列化和反序列化的组件

典型的序列化和反序列化进程常常需要以下组件:

IDL(Interface description language)文件:参与通讯的各方需要对通讯的内容需要做相干的约定(Specifications)。为了建立1个与语言和平台无关的约定,这个约定需要采取与具体开发语言、平台无关的语言来进行描写。这类语言被称为接口描写语言(IDL),采取IDL撰写的协议约定称之为IDL文件。

IDL Compiler:IDL文件中约定的内容为了在各语言和平台可见,需要有1个编译器,将IDL文件转换成各语言对应的动态库。

Stub/Skeleton Lib:负责序列化和反序列化的工作代码。Stub是1段部署在散布式系统客户真个代码,1方面接收利用层的参数,并对其序列化后通过底层协议栈发送到服务端,另外一方面接收伏务端序列化后的结果数据,反序列化后交给客户端利用层;Skeleton部署在服务端,其功能与Stub相反,从传输层接收序列化参数,反序列化后交给服务端利用层,并将利用层的履行结果序列化后终究传送给客户端Stub。

Client/Server:指的是利用层程序代码,他们面对的是IDL所生存的特定语言的class或struct。

底层协议栈和互联网:序列化以后的数据通过底层的传输层、网络层、链路层和物理层协议转换成数字信号在互联网中传递。

序列化组件与数据库访问组件的对照

数据库访问对很多工程师来讲相对熟习,所用到的组件也相对容易理解。下表类比了序列化进程中用到的部份组件和数据库访问组件的对应关系,以便于大家更好的掌控序列化相干组件的概念。

#4、几种常见的序列化和反序列化协议

互联网初期的序列化协议主要有COM和CORBA。

COM主要用于Windows平台,并没有真正实现跨平台,另外COM的序列化的原理利用了编译器中虚表,使得其学习本钱巨大(想1下这个场景, 工程师需要是简单的序列化协议,但却要先掌握语言编译器)。由于序列化的数据与编译器紧耦合,扩大属性非常麻烦。

CORBA是初期比较好的实现了跨平台,跨语言的序列化协议。COBRA的主要问题是参与方过量带来的版本过量,版本之间兼容性较差,和使用复杂晦涩。这些政治经济,技术实现和初期设计不成熟的问题,终究致使COBRA的渐渐灭亡。J2SE 1.3以后的版本提供了基于CORBA协议的RMI-IIOP技术,这使得Java开发者可以采取纯洁的Java语言进行CORBA的开发。

这里主要介绍和对照几种当下比较流行的序列化协议,包括XML、JSON、Protobuf、Thrift和Avro。

1个例子

如前所述,序列化和反序列化的出现常常晦涩而隐蔽,与其他概念之间常常相互包容。为了更好了让大家理解序列化和反序列化的相干概念在每种协议里面的具体实现,我们将1个例子穿插在各种序列化协议讲授中。在该例子中,我们希望将1个用户信息在多个系统里面进行传递;在利用层,如果采取Java语言,所面对的类对象以下所示:

Java Code复制内容到剪贴板

classAddress { privateStringcity; privateStringpostcode; privateStringstreet; } publicclassUserInfo { privateIntegeruserid; privateStringname; privateList<Address>address; }

XML&SOAP

XML是1种经常使用的序列化和反序列化协议,具有跨机器,跨语言等优点。 XML历史悠久,其1.0版本早在1998年就构成标准,并被广泛使用至今。XML的最初产生目标是对互联网文档(Document)进行标记,所以它的设计理念中就包括了对人和机器都具有可读性。 但是,当这类标记文档的设计被用来序列化对象的时候,就显得冗杂而复杂(Verbose and Complex)。 XML本质上是1种描写语言,并且具有自我描写(Self-describing)的属性,所以XML本身就被用于XML序列化的IDL。 标准的XML描写格式有两种:DTD(Document Type Definition)和XSD(XML Schema Definition)。作为1种人眼可读(Human-readable)的描写语言,XML被广泛使用在配置文件中,例如O/R mapping、 Spring Bean Configuration File 等。

SOAP(Simple Object Access protocol) 是1种被广泛利用的,基于XML为序列化和反序列化协议的结构化消息传递协议。SOAP在互联网影响如此大,以致于我们给基于SOAP的解决方案1个特定的名称--Web service。SOAP虽然可以支持多种传输层协议,不过SOAP最多见的使用方式还是XML+HTTP。SOAP协议的主要接口描写语言(IDL)是WSDL(Web Service Description Language)。SOAP具有安全、可扩大、跨语言、跨平台并支持多种传输层协议。如果不斟酌跨平台和跨语言的需求,XML的在某些语言里面具有非常简单易用的序列化使用方法,无需IDL文件和第3方编译器, 例如Java+XStream。

自我描写与递归

SOAP是1种采取XML进行序列化和反序列化的协议,它的IDL是WSDL. 而WSDL的描写文件是XSD,而XSD本身是1种XML文件。 这里产生了1种有趣的在数学上称之为“递归”的问题,这类现象常常产生在1些具有自我属性(Self-description)的事物上。

IDL文件举例

采取WSDL描写上述用户基本信息的例子以下:

<xsd:complexType name='Address'>

<xsd:attribute name='city' type='xsd:string' />

<xsd:attribute name='postcode' type='xsd:string' />

<xsd:attribute name='street' type='xsd:string' />

</xsd:complexType>

<xsd:complexType name='UserInfo'>

<xsd:sequence>

<xsd:element name='address' type='tns:Address'/>

<xsd:element name='address1' type='tns:Address'/>

</xsd:sequence>

<xsd:attribute name='userid' type='xsd:int' />

<xsd:attribute name='name' type='xsd:string' />

</xsd:complexType>

典型利用场景和非利用场景

SOAP协议具有广泛的大众基础,基于HTTP的传输协议使得其在穿越防火墙时具有良好安全特性,XML所具有的人眼可读(Human-readable)特性使得其具有出众的可调试性,互联网带宽的日趋剧增也大大弥补了其空间开消大(Verbose)的缺点。对在公司之间传输数据量相对小或实时性要求相对低(例如秒级别)的服务是1个好的选择。

由于XML的额外空间开消大,序列化以后的数据量剧增,对数据量巨大序列持久化利用常景,这意味着巨大的内存和磁盘开消,不太合适XML。另外,XML的序列化和反序列化的空间和时间开消都比较大,对对性能要求在ms级别的服务,不推荐使用。WSDL虽然具有了描写对象的能力,SOAP的S代表的也是simple,但是SOAP的使用绝对不简单。对习惯于面向对象编程的用户,WSDL文件不直观。

JSON(Javascript Object Notation)

JSON起源于弱类型语言Javascript, 它的产生来自于1种称之为"Associative array"的概念,其本质是就是采取"Attribute-value"的方式来描写对象。实际上在Javascript和PHP等弱类型语言中,类的描写方式就是Associative array。JSON的以下优点,使得它快速成为最广泛使用的序列化协议之1:

1、这类Associative array格式非常符合工程师对对象的理解。

2、它保持了XML的人眼可读(Human-readable)的优点。

3、相对XML而言,序列化后的数据更加简洁。 来自于的以下链接的研究表明:XML所产生序列化以后文件的大小接近JSON的两倍。http://www.codeproject.com/Articles/604720/JSON-vs-XML-Some-hard-numbers-about-verbosity

4、它具有Javascript的先天性支持,所以被广泛利用于Web browser的利用常景中,是Ajax的事实标准协议。

5、与XML相比,其协议比较简单,解析速度比较快。

6、疏松的Associative array使得其具有良好的可扩大性和兼容性。

IDL悖论

JSON实在是太简单了,或说太像各种语言里面的类了,所以采取JSON进行序列化不需要IDL。这实在是太奇异了,存在1种天然的序列化协议,本身就实现了跨语言和跨平台。但是事实没有那末奇异,之所以产生这类假象,来自于两个缘由:

第1、Associative array在弱类型语言里面就是类的概念,在PHP和Javascript里面Associative array就是其class的实际实现方式,所以在这些弱类型语言里面,JSON得到了非常良好的支持。

第2、IDL的目的是撰写IDL文件,而IDL文件被IDL Compiler编译后能够产生1些代码(Stub/Skeleton),而这些代码是真正负责相应的序列化和反序列化工作的组件。 但是由于Associative array和1般语言里面的class太像了,他们之间构成了逐一对应关系,这就使得我们可以采取1套标准的代码进行相应的转化。对本身支持Associative array的弱类型语言,语言本身就具有操作JSON序列化后的数据的能力;对Java这强类型语言,可以采取反射的方式统1解决,例如Google提供的Gson。

典型利用场景和非利用场景

JSON在很多利用场景中可以替换XML,更简洁并且解析速度更快。典型利用场景包括:

1、公司之间传输数据量相对小,实时性要求相对低(例如秒级别)的服务。

2、基于Web browser的Ajax要求。

3、由于JSON具有非常强的前后兼容性,对接口常常产生变化,并对可调式性要求高的场景,例如Mobile app与服务真个通讯。

4、由于JSON的典型利用场景是JSON+HTTP,合适跨防火墙访问。

总的来讲,采取JSON进行序列化的额外空间开消比较大,对大数据量服务或持久化,这意味着巨大的内存和磁盘开消,这类场景不合适。没有统1可用的IDL下降了对参与方的束缚,实际操作中常常只能采取文档方式来进行约定,这可能会给调试带来1些不便,延长开发周期。 由于JSON在1些语言中的序列化和反序列化需要采取反射机制,所以在性能要求为ms级别,不建议使用。

IDL文件举例

以下是UserInfo序列化以后的1个例子:

{"userid":1,"name":"messi","address":[{"city":"北京","postcode":"1000000","street":"wangjingdonglu"}]}

Thrift

Thrift是Facebook开源提供的1个高性能,轻量级RPC服务框架,其产生正是为了满足当前大数据量、散布式、跨语言、跨平台数据通讯的需求。 但是,Thrift其实不仅仅是序列化协议,而是1个RPC框架。相对JSON和XML而言,Thrift在空间开消和解析性能上有了比较大的提升,对对性能要求比较高的散布式系统,它是1个优秀的RPC解决方案;但是由于Thrift的序列化被嵌入到Thrift框架里面,Thrift框架本身并没有透出序列化和反序列化接口,这致使其很难和其他传输层协议共同使用(例如HTTP)。

典型利用场景和非利用场景

对需求为高性能,散布式的RPC服务,Thrift是1个优秀的解决方案。它支持众多语言和丰富的数据类型,并对数据字段的增删具有较强的兼容性。所以非常适用于作为公司内部的面向服务构建(SOA)的标准RPC框架。

不过Thrift的文档相对照较缺少,目前使用的大众基础相对较少。另外由于其Server是基于本身的Socket服务,所以在跨防火墙访问时,安全是1个顾虑,所以在公司间进行通讯时需要谨慎。 另外Thrift序列化以后的数据是Binary数组,不具有可读性,调试代码时相对困难。最后,由于Thrift的序列化和框架紧耦合,没法支持向持久层直接读写数据,所以不合适做数据持久化序列化协议。

IDL文件举例

struct Address

{

1: required string city;

2: optional string postcode;

3: optional string street;

}

struct UserInfo

{

1: required string userid;

2: required i32 name;

3: optional list<Address> address;

}

Protobuf

Protobuf具有了优秀的序列化协议的所需的众多典型特点:

1、标准的IDL和IDL编译器,这使得其对工程师非常友好。

2、序列化数据非常简洁,紧凑,与XML相比,其序列化以后的数据量约为1/3到1/10。

3、解析速度非常快,比对应的XML快约20⑴00倍。

4、提供了非常友好的动态库,使用非常简介,反序列化只需要1行代码。 Protobuf是1个纯洁的展现层协议,可以和各种传输层协议1起使用;Protobuf的文档也非常完善。 但是由于Protobuf产生于Google,所以目前其仅仅支持Java、C++、Python3种语言。另外Protobuf支持的数据类型相对较少,不支持常量类型。由于其设计的理念是纯洁的展现层协议(Presentation Layer),目前并没有1个专门支持Protobuf的RPC框架。

典型利用场景和非利用场景

Protobuf具有广泛的用户基础,空间开消小和高解析性能是其亮点,非常合适于公司内部的对性能要求高的RPC调用。由于Protobuf提供了标准的IDL和对应的编译器,其IDL文件是参与各方的非常强的业务束缚,另外,Protobuf与传输层无关,采取HTTP具有良好的跨防火墙的访问属性,所以Protobuf也适用于公司间对性能要求比较高的场景。由于其解析性能高,序列化后数据量相对少,非常合适利用层对象的持久化场景。

它的主要问题在于其所支持的语言相对较少,另外由于没有绑定的标准底层传输层协议,在公司间进行传输层协议的调试工作相对麻烦。

IDL文件举例

message Address

{

required string city=1;

optional string postcode=2;

optional string street=3;

}

message UserInfo

{

required string userid=1;

required string name=2;

repeated Address address=3;

}

Avro

Avro的产生解决了JSON的冗杂和没有IDL的问题,Avro属于Apache Hadoop的1个子项目。 Avro提供两种序列化格式:JSON格式或Binary格式。Binary格式在空间开消和解析性能方面可以和Protobuf媲美,JSON格式方便测试阶段的调试。 Avro支持的数据类型非常丰富,包括C++语言里面的union类型。Avro支持JSON格式的IDL和类似于Thrift和Protobuf的IDL(实验阶段),这二者之间可以互转。Schema可以在传输数据的同时发送,加上JSON的自我描写属性,这使得Avro非常合适动态类型语言。 Avro在做文件持久化的时候,1般会和Schema1起存储,所以Avro序列化文件本身具有自我描写属性,所以非常合适于做Hive、Pig和MapReduce的持久化数据格式。对不同版本的Schema,在进行RPC调用的时候,服务端和客户端可以在握手阶段对Schema进行相互确认,大大提高了终究的数据解析速度。

典型利用场景和非利用场景

Avro解析性能高并且序列化以后的数据非常简洁,比较合适于高性能的序列化服务。

由于Avro目前非JSON格式的IDL处于实验阶段,而JSON格式的IDL对习惯于静态类型语言的工程师来讲不直观。

IDL文件举例

protocol Userservice {

record Address {

string city;

string postcode;

string street;

}

record UserInfo {

string name;

int userid;

array<Address> address = [];

}

}

所对应的JSON Schema格式以下:

JavaScript Code复制内容到剪贴板

{ "protocol":"Userservice", "namespace":"org.apache.avro.ipc.specific", "version":"1.0.5", "types":[{ "type":"record", "name":"Address", "fields":[{ "name":"city", "type":"string" },{ "name":"postcode", "type":"string" },{ "name":"street", "type":"string" }] },{ "type":"record", "name":"UserInfo", "fields":[{ "name":"name", "type":"string" },{ "name":"userid", "type":"int" },{ "name":"address", "type":{ "type":"array", "items":"Address" }, "default":[] }] }], "messages":{} }

#5、Benchmark和选型建议

##Benchmark

以下数据来自https://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

解析性能

序列化之空间开消

从上图可得出以下结论:

1、XML序列化(Xstream)不管在性能和简洁性上比较差。

2、Thrift与Protobuf相比在时空开消方面都有1定的劣势。

3、Protobuf和Avro在两方面表现都非常优越。

选型建议

以上描写的5种序列化和反序列化协议都各自具有相应的特点,适用于不同的场景:

1、对公司间的系统调用,如果性能要求在100ms以上的服务,基于XML的SOAP协议是1个值得斟酌的方案。

2、基于Web browser的Ajax,和Mobile app与服务端之间的通讯,JSON协议是首选。对性能要求不太高,或以动态类型语言为主,或传输数据载荷很小的的应用场景,JSON也是非常不错的选择。

3、对调试环境比较卑劣的场景,采取JSON或XML能够极大的提高调试效力,下降系统开发本钱。

4、当对性能和简洁性有极高要求的场景,Protobuf,Thrift,Avro之间具有1定的竞争关系。

5、对T级别的数据的持久化利用场景,Protobuf和Avro是重要选择。如果持久化后的数据存储在Hadoop子项目里,Avro会是更好的选择。

6、由于Avro的设计理念偏向于动态类型语言,对动态语言为主的利用场景,Avro是更好的选择。

7、对持久层非Hadoop项目,以静态类型语言为主的利用场景,Protobuf会更符合静态类型语言工程师的开发习惯。

8、如果需要提供1个完全的RPC解决方案,Thrift是1个好的选择。

9、如果序列化以后需要支持不同的传输层协议,或需要跨防火墙访问的高性能场景,Protobuf可以优先斟酌。

3 : 建站经验 新站我们如何通过网站基础数据分析提升网站优化效果

尽人皆知,新站上线以后要经太长达3个月的审核期,在这个考察期内我们每天做好基础性的工作,比如为网站添加优良的内容,适当的为网站寻觅1些外部链接,在这3个月的考察期内,我们第1个月正常更新网站内容便可第2月和第3个月就要陆续的为网站进行1些高权重的外链建设了,那在这个时间段内我们如何分析我们网站的优化效果呢?由于这个时间段,可能网站主关键词没排名,收录非常不稳定,我们通过那些细节可以了解我们优化手法是正确的呢?好,今天笔者和大家分析,新站上线我们如何通过网站基础数据分析优化效果。

第1,网站内容的收录情况变化是站长首先要关注的基础。1般情况下新站上线只要延续在每一个正常工作日为网站更新1篇文章,两周左右你就会通过site命令视察到收录的细节变化,可能这个时候只是收录到了首页,我们没必要气馁,继续坚持优良内容的更新思路,在第1个月的月底你就会看到百度会陆续放出你更新的文章,固然不同行业也许存在或多或少的差别,但是分析的方式大同小异,如果自己发布的文章被收录又迅速删除,或自己每天发布文章1个月了收录还是寥寥无几,你最好分析下网站质量是不是存在问题。

第2,分析网站的外链增长情况。外链建设最好放在第2个月结合文章更新进行1起操作,外链收录的速度要缘由大于内容收录的速度,由于外链我们会选择高权重的平台进行发布,所以1般情况下第2天就能够看到外链收录变化情况,新站进行外链建设的时候笔者要提示大家的是不要认为新站每天外链增长速度快就是好事,新站我们在进行外链建设的时候1定要掌控外链质量,最好不要每天频繁的为网站增加外链,即便是高权重的外链也要隔3差5的去做,自然很关键,高权重的外链笔者推荐的方式是可以写软文去站长网投稿、可以注册第3方博客发布新闻或产品资讯、可以去高权重的论坛进行软文发布,企业网站可以选择行业分类信息平台进行产品的推行,外链建设很可能平台选择多样化1些,但是要自然的进行外链建设,鸟枪换炮不断变换我们的外链发布阵地,切忌,大范围增长速度的外链建设。

第3:分析网站的关键词排名情况。对竞争性不是非常剧烈的行业,1般3个月左右,网站主页就会出现1些良性的表现,比如首页第1个显著的表现就是进入前100名,首页进入前10页表明自己的优化策略和方式是符合百度的要求的,我们要继续坚持我们的操作方式,经过1段时间的努力可能关键词排名进入80位、60位了这个时候我们在高兴的同时更好时刻注意我们的优化方法,自然是最为关键和基础的,1切以质量为王的理念去操作,可能这个时候排名非常不稳定忽高忽低我们也不要惶恐失措,只需要淡定的依照自己的思路进行便可,网站优化百度考核期本身就是1项非常严格的事情,通过这些细节的变化我们在某种程度上可以不断调剂我们的优化方式,从而让网站不断符合百度的优化要求。

第4,网站长尾词也间接取得了排名。我们知道长尾词优化是内容写作进程中1个非常重要的要点,经过3个月左右的操作如果自己优化方式正确的化,主关键词进入百名以内后,1些偏门的长尾词就会渐渐浮出水面,我们可以通过站长工具后台去分析我们的网站流量情况,可能这个时候流量非常之少,但是不要气馁,我们的主要目的是视察我们写作的文章是不是被百度收录,并且1些冷门词是不是取得了相应的排名,1旦发现有良性的迹象出现,我们就要加强此类文章的写作力度,不断扩大我们的长尾词词库,争取更多的内容页长尾词入围百度的考核范围,固然新站我们1定要选择偏门但是用户可能会搜索到的词语,新站权重低不代表着我们所有长尾词都不能得到排名,竞争对手没有关注的词语就是我们的机会所在。

总的来讲,新站上线我们除耐性以外千万不能束手待毙,我们要时刻关注我们的网站数据变化,时刻分析我们网站在搜索引擎的种种表现,这些表现看似正常实际上是我们优化思路的直接体现,不要认为1切不良的现象都是正常的,新站我们要仔细分析每个百度对网站数据的波动和收录变化,及时做出应对和调剂,这样才能让新站在1个正规、良性的轨道上前行,谢谢浏览,希望能帮到大家,请继续关注网聚知识,我们会努力分享更多优秀的文章。

4 : 网站数据分析之1:了解网站页面的点击情况(图文)

有时候我们需要了解网站页面中各链接的点击情况,特别是网站的首页和1些中间页,这对网站的内容编排、用户体验优化都能起到很好的指点作用。Google Analytics的老版本有Site Overlay(网站覆盖图)的功能,可以查看网站首页的点击散布情况,新版本将这个功能重新命名为In-Page Analytics,可以在Content模块中查看,下面是我的博客的1张使用截图:

如图所示,GA的In-Page Analytics用气泡的情势显示了页面中每一个可点链接的点击转化率(CTR, Click Through Rate),这里页面中各链接的点击转化率是通过页面链接的点击次数除以页面阅读次数计算得到的,用来表现用户在阅读当前页面的时候更偏向去往哪些下1页面,具体的点击次数会在鼠标移动到相应链接后显示。

其实使用GA的In-Page Analytics不但可以视察页面中各链接点击情况,还可以视察页面当前显示部份的点击占比,比如上图该页面显示部份的点击占比为1⑷1%=59%,图中最下方显示还有41%的点击是在当前显示部份的下方。这个功能其实可以告知我们1些非常有用的信息,用户在阅读页面的时候更偏向于在哪1屏产生点击?由于目前大部份网站的页面都不会在1屏就结束,用户阅读完全的内容常常需要使用鼠标的滚轮或进行下拉,那末大部份用户到底会关注到页面第几屏的内容,这个功能每屏的点击占比散布可以告知我们1些线索。

先解释1下这里“1屏”究竟是1个甚么概念,这里1屏主要指用户在打开页面不进行下拉时所能显示的页面长度部份,这跟电脑的显示器和屏幕分辨率有关,比如我的博客首页在我的笔记本上打开大概显示4屏多1点,在分辨率较低的显示器下面可能需要显示的屏数就会增加,需要更多的下拉;而分辨率高的显示器1屏内能够显示的页面更长,可能就不再需要4屏。

用户阅读页面的内容是有局限性的,并且用户对内容的兴趣和耐心也是有限的,用户常常只会重点关注1下子就映入眼帘的内容,所以页面的前脸部分1定会有更多的用户关注,而随着不断下拉,后脸部分的内容的关注度逐渐减少,我们可以根据In-Page Analytics上面提供的数据来看看这个局部减少的进程:

根据我的博客首页的点击散布情况,超过60%的点击产生在第1屏,第2屏基本上占据了30%左右的点击,第3屏在6%⑺%,下面所有剩下了几屏唯一2%⑶%的页面点击占比,我们可使用点击热图分析得到类似的页面点击散布情况。可能有人会说你的博客大部份的链接都集中在第1屏和第2屏,以后几屏的链接数量都比较少,所以点击占比前面两屏很高也是说得过去的,有1定的道理,但即便博客的第1屏和第2屏有近似密度的可点击链接,可以看到第2屏的点击量相比第1屏还是出现了大幅的衰减,另外可以通过点击热图等工具看看页面每屏的无效点击数,基本可以看出散布的情况也大概符合上面的规律,逐屏大幅降落,在3屏以后寥寥无几。

如果你仔细关注过国内外的各个门户网站,可以看到国内外门户网站页面长度的设计存在明显的差异。可以尝试去上下Yahoo!主站、BBC、CNN等国外主流门户,基本上这些网站的首页长度设计在3⑷屏;再看看国内的几个门户,网易5屏、腾讯接近6屏、新浪更是恐怖的8屏(都是基于我自己的笔记本上显示)。所以如果大部份用户阅读网站的习惯跟我的博客使用Google In-Page Analytics上面分析得出的结果符合,那末国内门户的首页后面几屏的内容基本都成了摆设,由于100个人里面只有2⑶个人会关注到这些内容。

在之前的工作中分享“如何有效提升内容暴光点击率”也提到过类似的问题,必须格外重视首页第1屏的内容质量和显现方式,由于这部份的内容将主导网站内容的暴光点击率。很明显,1个网站的首页阅读量大概占据了全站的20%到30%(因网站设计而异),而首页的第1屏又占据了首页60%以上的关注度,所以可以看到首页第1屏对全部网站而言是何其的重要。

固然,In-Page Analytics功能另外1个重要的用户就是分析各内容列表或模块的点击情况,以下图的博客侧边栏“分类目录”和“标签”两个模块的点击情况:

如左图所示,用户明显更喜欢通过“分类目录”查看博客的内容,用户最喜欢点击哪些分类?有点出乎我的意料,“数据分析方法”和“网站分析工具”两个目录更受欢迎,想必大家都喜欢浏览和学习下工具和方法方面的内容,以后尽可能多整理1些这方面的内容。

新版V5版的Google Analytics的In-Page Analytics不单单支持网站首页的点击情况统计,在Content模块Site Content的Pages我们可以看到上方的“Navigation Summary”标签旁边有“In-Page”标签,GA已支持了所有页面的点击散布图,而且都是免费的,你只要在选择相应页面后点击这个“In-Page”标签就能够进行查看。

每一个页面有了点击散布情况的统计,这样对页面各个模块或列表的效果评估就变得简单很多,正如我之前的文章——优化相干内容推荐介绍的是使用“Navigation Summary”来评估相干内容推荐模块的点击效果,这里就能够尝试使用In-Page Analytics来分析数据表现:

右图是《T检验和卡方检验》这篇文章下方的“相干文章”推荐模块的点击情况,可以看到推荐的5篇文章都取得了不错的点击转化率,但明显排在第2位的《提升用户满意度》这篇文章的数据还不够给力,也许用户不喜欢点击这类内容看上去会比较空的标题。

图中有个细节不知道各位有无注意到,“相干文章”的推荐模块只是上部份,下面还有两个链接分别指向上1篇和下1篇发布的文章,而恰好“下1篇:比较测试的设定和分析”是跟相干文章推荐模块有重复的,而这里显示的点击转化率都为5.7%,其实在In-Page Analytics这个功能里面页面中的相同链接GA是不进行分辨的,也就是GA只认URL为标识,不辨别这个URL链接在页面中的位置,大概的统计逻辑应当是1个页面中链接的点击次数为referral是该页面的链接URL的阅读次数Pageviews,所以1个页面中重复链接中输出的点击率应当是根据所有相同链接点击总数计算得到了,数值是完全1致的。比如《比较测试的设定和分析》这篇文章的链接在《T检验和卡方检验》文章页面会有3个地方出现,包括图中的那两处还有右边边栏的引导到下1篇的链接,这3处地方显示的点击转化率是这3处产生点击的总和计算得到的,数值是完全1致的。

GA的这个处理方式给针对某个模块点击效果的评估造成了1定的困难,由于点击次数没法辨别是不是来源于那个模块,或是由于其他相同链接的点击带来。固然,解决方案还是有很多,可以为模块的链接加上参数,如“相干文章”模块的链接都带上?from=related-content,也能够使用GA的事件追踪(Event Track)和虚拟页面(Virtual Page)这两种方式,具体参考用户点击与网站目标中的介绍。

睡眠性癫痫发病有什么症状乐山治疗白癜风医院那家好啊感染内科

相关推荐