0


为什么大数据的埋点接收服务都返回GIF格式的图片

本文总计 1400 字,预计阅读需要 5-7 分钟

埋点上报

数据埋点是数据采集的一种重要方式,主要用来记录和收集终端用户的操作行为,其基本原理是在App/H5/PC等终端部署采集的SDK代码,当用户的行为满足某种条件的时候,比如进入某个页面、点击某个按钮等,会自动触发记录和存储,然后这些数据会被收集并被传输到接收机,然后再经过消息队列(常用kafka)传输到大数据相关的处理流程,最后产生报表等服务提供给相关的人员使用。

埋点数据内容

数据埋点的记录主要包括以下5个方面:who,what,when,where,how

who的确认方式包括cookie,uuid,idfv等,还有账号,手机号(设备id和用户id)

when包括事件发生时间,事件上报时间,事件接受时间,事件入库时间。以用户的角度,事件发生事件是真正的时间,但埋点的上传可能不是同步的,同时,意外情况下,导致时间不匹配,比如用户突然断网,导致事件上传时间延迟。

where 包括GPS和IP,自主填写(产品可能与地理位置有关,比如租房app,打车app)

how用户如何做的?从哪个页面跳转过来的,使用的环境是怎样的?(设备,工具)

what尝试去描述一个事件,直到能基本能唯一确认这件事,比如购买事件,包含哪些?购买的产品是什么?价格是什么?付款的方式是什么?购买的数量是什么?

埋点数据上报

前端在获取用户行为数据以后会通过特定的接口服务(接收机)将数据发送给后端,接收机负责接收和保存前端上传的行为数据。无论是手动埋点,自动埋点还有无埋点都是前端处理方式的不同的(或者叫触发方式不同),对于接收机来说接收的都是相同的数据(如果接收机程序抽象的好甚至格式都可以是相同的)。接收机提供的接口服务一般都是使用GIF文件格式作为结果的返回,例如下图的百度统计:

友盟、GA等都是类似的GIF格式的返回。

为什么埋点都是用GIF格式作为返回

接收机其实并不关心上报格式,但是为什么所有系统都统一使用了请求GIF图片的方式上报数据呢?

主要有3点:

1、跨域

埋点的域名都不是当前域名(二级域名不同,如果是第三方服务主域名也不同)所以所有的接口请求都会构成跨域。而跨域请求很容易出现由于配置不当被浏览器拦截并报错。但图片的src属性并不会跨域并且同样可以发起请求,前端可以将收集好的数据整理成KV的格式作为get参数传递给接收机,这样就解决了跨域的问题。

2、节省服务器带宽

与PNG/JPG相比,GIF的体积最小,因为不需要使用返回结果,所以只需要返回一个最小的有效数据就可以了。而最小的BMP文件需要74个字节,PNG需要67个字节,合法的GIF只需要43个字节(上面截图 content-lenght:43)。同样的响应,GIF可以比BMP节约41%的流量,比PNG节约35%的流量。

看似数据并不是很大,平均一个用户的访问周期内需要上报200-500条数据,这么算下来,带宽的节省就是一个非常可观的数字了。

3、用户体验

页面创建资源节点后只有将对象注入到浏览器DOM树后,浏览器才会实际发送资源请求。反复操作DOM不仅会引发性能问题,而且载入js/css资源还会阻塞页面渲染,影响用户体验。

但是图片就不一样了,构造图片不仅不用插入DOM,只要在js中new出Image对象就能发起请求,而且还没有阻塞问题,在没有js的浏览器环境中还能通过img标签正常请求,这是其他类型的资源请求所做不到的。以前会经常看到

noscript

标签就是为了再没有js环境下进行操作,但是现在已经很少见了。

所以现在基本上所有的接收机返回都是1*1像素的透明GIF

1x1像素是最小的合法图片。图片是透明不会影响页面本身展示效果并且透明GIF只要使用一个二进制位标记图片是透明色,算上GIF的格式头一共需要43个字节,这是目前最小的合法图片的尺寸。

标签: 系统架构

“为什么大数据的埋点接收服务都返回GIF格式的图片”的评论:

还没有评论