用户体验研究过程中,我们经常需要使用前端脚本采集用户访问行为相关的数据,例如监听鼠标的点击事件,记下点击的位置及被点击的元素等。一个不可避免问题是,何时将采集到的数据发送到服务器呢?最直接的方案是每次收集到数据后立即发送,但这可能会带来较多的HTTP请求,一方面降低页面的性能,另一方面也增加了打点服务器的压力。另一个方案是先将收集的数据缓存一下,然后按一定规则发送(比如每收集满10条数据发一次,或者每隔5秒钟发一次),其中最终极的方案是所有的数据都缓存起来直到离开页面之前(beforeunload事件触发时)再发送。不过这个终极方案也有自己的问题,比如beforeunload这个事件可靠吗?在这个事件中发送打点的丢失率有多少?近期我们就这些问题做了一个研究,对这个丢失率也有了一个更具体的认识。主要的研究过程如下:
首先我们需要收集数据,这儿主要有两个数据:页面加载时立即发送一个打点,称为PV打点;监听页面的beforeunload事件,在这个事件触发时再发送一个打点,称为unload打点。显然,如果丢失率为0或非常小的话,PV打点的数目和unload打点的数目应该相等或非常接近。即丢失率的计算公式为:丢失率=(PV-unload)/PV*100%
如下图所示:
按这个思路,我们在淘宝页面上进行了抽样埋点,并取得了足够多的PV及unload打点数据。但现实总是不完美的,整理这些数据的过程中,我们发现一些unload数据没有对应的PV数据,也就是说,由于各种各样的原因,不仅绑定beforeunload事件的unload打点有可能丢失,在页面初始化时发送的PV打点也可能丢失,尽管这个概率非常低。于是,我们又为打点添加了一个pvid参数,值为一个随机生成的字符串,每一组PV/unload打点的pvid都是相同的。这样,我们就能通过这个参数过滤出那些完整的PV/unload打点记录,再经过一些适当的整理,我们就得到了可以进行统计的有效数据。
接下来,根据上面的公式,我们算出了beforeunload打点的总丢失率,约为20.81%,整个过程如下图所示:
使用上面的方法我们连续统计了若干天的数据,发现beforeunload的总体丢失率维持在20%附近。接下来,我们再把这个数据按浏览器进行细分,看各个浏览器下这个丢失率是否有差异。
首先看一下当前浏览器分布情况:
清洗过的日志数据再根据UA字段细分后的结果为:
从上图可以看到,各大浏览器的表现并不一样,其中份额占比最大的IE8在丢失率上表现最好,远低于总体平均水平,而chrome和safari却远高于平均值。各浏览器的丢失率乘以它们各自的权重(市场份额)之后再求和,就得到了总的平均丢失率,在我们的实验中,这个总丢失率约为20%。
结论:使用beforeunload事件打点并不可靠,总丢失率在20%左右,其中各浏览器的表现各不相同;当然在一些丢失率要求不高的采集任务中这个事件还是能派上用场的,比如说统计页面停留时间、页面内容曝光比例等。
最后需要特别说明的是:丢失率与用户浏览器分布情况、所采用的打点方式以及打点服务器响应速度等因素都有关,本结果仅供参考。
统计人:鱼相、季札。