1. 前言

神策数据微信小程序 SDK,是一款轻量级用于微信小程序端的数据采集埋点 SDK,包含代码埋点、全埋点功能。其中,全埋点功能通过代理微信小程序原生 App、Page、Component 接口及相应生命周期函数来实现。下面将以 SDK 版本 v1.13.28 为例介绍微信小程序 SDK 的架构。

2. 目录结构

神策数据微信小程序 SDK 自开源以来,SDK 的代码和目录结构不断调整、优化。目前开源代码中存在 product 目录以及其他不同版本的源码文件,如图 2-1 所示:

图 2-1 微信小程序 SDK 源码目录

其中,几个主要目录的介绍如下:

  • /product:未压缩的源码文件;
  • /sensorsdata.custom.es6.min.js:支持 ES6 导入导出语法的自定义版 SDK 源码文件;
  • /sensorsdata.custom.min.js:支持 require 语法引入的自定义版 SDK 源码文件;
  • /sensorsdata.min.es6.js:支持 ES6 导入导出语法的全埋点版 SDK 源码文件;
  • /sensorsdata.min.js:支持 require 语法引入的全埋点版 SDK 源码文件。

3. 数据流程

数据从采集到发送的流程如图 3-1 所示:

图 3-1 数据流程图

通过上图可以知道,数据流程主要包括如下几个步骤:

  1. 首先会针对上传的事件以及属性做格式校验;
  2. 批量发送配置下,将数据缓存到内存与本地,达到发送条件后通过网络发送。发送成功后将已发送的数据删除,发送失败后进行重试;
  3. 实时发送配置下,数据会先保存到发送队列中,然后逐条发送,发送完成后(不论成功失败)将已发送的数据删除;
  4. 无论批量发送还是实时发送,请求时间超过设置的超时时间(默认为 3 秒)后,都会取消该请求。

4. 架构解析

4.1 简介

如上所述,神策数据微信小程序 SDK 是一款轻量级用于微信小程序端的数据采集埋点 SDK,而数据采集是构建数据平台的核心要素。数据采集是否完整、是否准确、是否及时、能否关联打通,都直接影响整个数据平台的应用效果。因此,神策数据微信小程序 SDK 采用了良好的架构来保证数据的采集。

4.2 架构图

神策数据微信小程序 SDK 总体架构如图 4-1 所示:

图 4-1 微信小程序 SDK 总体架构图

4.3 架构详解

4.3.1 初始化模块

SDK 初始化模块中,主要包括初始化参数配置和初始化数据缓存队列两个功能。

1. 初始化参数配置

在引入神策数据微信小程序 SDK 之后,通过调用 setPara() 接口进行 SDK 初始化参数的相关配置。常见的配置项如下:

  • server_url:数据接收地址,必须配置,无默认值;
  • autoTrack:全埋点控制开关,可通过 autoTrack.appLaunch、autoTrack.appShow、autoTrack.appHide、autoTrack.pageShow、autoTrack.mpClick、autoTrack.pageShare 、autoTrack.mpFavorite 分别控制对应全埋点事件的开启和关闭;
  • show_log:是否在控制台打印数据。

其中,全埋点控制的代码如下:

/**
 * 初始化 Sensors Analytics SDK
 */
const sa = require('./sensorsdata.min.js');
sa.setPara({
    server_url: '',
    autoTrack: {
        appLaunch: true,   // 控制是否采集 $MPLaunch
        appShow: true,     // 控制是否采集 $MPShow
        appHide: true,     // 控制是否采集 $MPHide
        pageShow: true,    // 控制是否采集 $MPViewScreen
        pageShare: true,   // 控制是否采集 $MPShare
        mpClick: true,     // 控制是否采集 $MPClick
        mpFavorite: true   // 控制是否采集 $MPAddFavortes
    }
})

2. 初始化数据缓存队列

神策数据微信小程序 SDK 提供了 init() 接口来让开发者决定 SDK 初始化完成的时机,只有当 SDK 初始化完成后,用户触发的事件数据才会通过网络发送出去。否则,数据会被保存到初始化数据缓存队列中,等初始化完成后,再将队列中的数据读发送出去。初始化流程如图 4-2 所示:

图 4-2 初始化流程图

4.3.2 数据采集模块

数据采集模块是核心模块,主要负责准确、完整地通过埋点来采集数据。数据采集模块主要提供了如下几个功能:

  • 代码埋点:在 SDK 初始化之后,对需要采集的事件,调用 track 接口埋点采集事件;
  • 全埋点:无需开发工程师写代码或者写少量的代码,即可预先自动收集用户的所有或者绝大部分的行为数据;
  • 预置属性:埋点 SDK 自动采集的,任何事件都需要携带的一些最基本的属性(例如操作系统类型、操作系统版本号、运营商信息、应用程序版本号、设备厂商等)。

关于这些功能的介绍,可以参考《神策数据微信小程序 SDK 功能介绍》,这里不再赘述。

4.3.3 数据存储模块

为了最大限度的保证事件数据的准确性和及时性,会要求数据采集 SDK 尽快将事件数据同步到服务端。但在某些情况下(例如用户处于断网环境)会导致事件数据无法同步或者同步失败;多条事件连续触发时,后触发的事件可能会先到达服务器,导致行为序列差异。

因此,微信小程序 SDK 在采集到数据后,针对实时发送方式,会先把事件数据缓存在一个队列中。待上一条发送请求完成之后,再去发送下一条数据。而针对批量发送方式下,会将数据缓存到内存和本地中,同时使用客户端时间记录事件触发时间,待达到触发条件后,再发送。

4.3.4 数据发送模块

在数据存储模块中,介绍了如何把数据存储到客户端本地或者内存队列中。如果事件数据一直缓存着是没有意义的,我们还需要把数据同步到服务端。然后再经过服务端的存储、抽取、分析和展现,才能充分发挥数据的价值。因此,数据发送模块主要负责如何把缓存的事件数据同步给服务端。

在微信小程序的开发中,可以直接利用微信小程序提供的封装好的官方接口 wx.request() 进行网络请求的发送。目前,微信小程序 SDK 支持两种发送方式:

  • 实时发送:将存储到缓存队列中的数据逐条读取和发送。后一条数据只有在前一条数据发送完成后,才会被读取出来并发送,前一条数据发送完成后从队列中删除;
  • 批量发送:数据在一定时间或者缓存队列中积累到一定条数之后,通过 wx.request() 将所有的数据发送出去。请求发送失败时,发送失败的数据在下次发送时与新数据一同发送;请求发送成功时,会将缓存中已发送的数据删除;

默认情况下,微信小程序 SDK 使用实时发送。批量发送方式可以通过 setPara() 接口设置 batch_send 来配置发送间隔时间和条数。

4.3.5 工具模块

神策数据微信小程序 SDK 提供了许多埋点相关的工具接口,这些辅助工具可以帮助埋点的实现。例如:_.getUtmFromPage 提供解析当前页面参数的功能;_.getCurrentPath 接口获取当前页面路径;sa.store 对象提供对用户标识的创建、校验、存储等功能。关于这些辅助工具的功能和实现就不再赘述了,具体可以参考 SDK 的源码。

4.3.6 日志模块

初始化参数中 show_log 配置为 true,会开启日志输出功能,可以在微信小程序开发者工具的控制台中打印出采集的数据日志,如下所示:

5. 总结

本文围绕神策数据微信小程序 SDK 的架构进行了全面的介绍,旨在让大家对于 SDK 的架构有一个清晰的了解。关于 SDK 的具体技术实现等相关知识,会在后续的文章中逐步向大家介绍。