menu
Is this helpful?

# 首次事件校验

本章节将介绍 TA 系统的特殊数据结构——首次事件校验的使用方法。首次事件校验是一种数据过滤特性,在事件数据中加入唯一标识 ID,系统收到数据时会比对该 ID 之前是否出现,ID 已出现的数据将无法入库,未出现的数据可以入库,并记录该 ID,以此保证该 ID 首次出现的事件才会入库。

WARNING

首次事件校验的性能开销较大,不建议在所有事件加入该校验,并且建议在 TA 工作人员的协助下进行使用

# 一、数据结构

使用”首次事件校验“特性,需要在数据中进行一个调整:

  • 增加 ID 字段#first_check_id,类型必须是字符串,该字段是校验首次事件的标识 ID,该 ID 首条出现的数据将入库,之后出现的都无法入库。不同事件的#first_check_id互相独立,因此每个事件的首次校验互不干扰

以下是一条数据样例,可以关注#first_check_id的所在位置:

{
  "#account_id": "ABCDEFG-123-abc",
  "#distinct_id": "F53A58ED-E5DA-4F18-B082-7E1228746E88",
  "#type": "track",
  "#ip": "192.168.171.111",
  "#uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "#time": "2017-12-18 14:37:28.527",
  "#first_check_id": "123456",
  "#event_name": "test",
  "properties": {
    "argString": "abc",
    "argNum": 123,
    "argBool": true
  }
}

上述数据中的#first_check_id为"123456",如果事件"test"之前已经入库了#first_check_id为"123456"的另一条数据,则该条数据无法入库,如果之前没有入库过,则该条数据可以入库

# 二、数据处理逻辑

TA 系统会为每一个事件维护一张 ID 表,不同事件之间 ID 表互相独立。

当系统收到带有#first_check_id的事件数据时,会在相应事件的 ID 表中查找该数据的#first_check_id,根据查询结果,会进行不同处理:

  1. 如果 ID 表中不存在该#first_check_id,则该条数据通过校验,将会直接入库,并且 ID 表中将记录该#first_check_id
  2. 如果 ID 表中存在该#first_check_id,则该条数据将被直接抛弃

如果同一个事件,既上传了带有#first_check_id的数据,也上传了不带有该字段的数据,那么不带有该字段的数据不会经过首次事件校验的处理,和通常的数据一致

TIP

除以上的关键逻辑外,此处还有两个注意点:

1.为了保证性能,系统采用定时批处理的方式进行判断,默认间隔为 1 小时,因此使用首次事件校验的事件数据会有默认 1 个小时的查询延迟

2."#first_check_id"在处理后不会记录在数据库中,如果需要记录,请使用一个事件属性记录

# 三、最佳实践

# 设备新增

设备新增数据非常适合使用首次事件校验,可以在每次应用启动时,上报一条以设备 ID 作为#first_check_id的”设备新增“事件,根据首次事件校验的逻辑,只有设备 ID 首次出现的”设备新增“事件会被记录下来,之后出现的数据都会被抛弃。因此入库事件就是每个设备 ID 首次出现的事件,符合设备新增的逻辑。

以下是使用首次事件校验的”设备新增“事件的样例:

{
  "#distinct_id": "F53A58ED-E5DA-4F18-B082-7E1228746E88",
  "#type": "track",
  "#ip": "192.168.171.111",
  "#time": "2017-12-18 14:37:28.527",
  "#first_check_id": "device_id_123456",
  "#event_name": "new_device",
  "properties": {
    "device_id": "device_id_123456"
  }
}

该事件可以在每次应用启动时上报,并以设备 ID 作为#first_check_id;除此之外,也可以加入其它属性,比如”设备型号“,”来源渠道“等等,增加分析时的维度。 TA 客户端 SDK 或服务端 SDK,可查看对应 SDK 的接入指南,指南中“可更新事件”及“可重写事件”章节将会提供详细的接口调用方法