行为采集 之 微信端如何做IdMapping
背景
目前微信端月活已经超过11亿,借助微信生态起家的公司不计其数;易企秀作品访客日志90%是微信端贡献的,每天3-4千万的pv访问量, 如果只是通过cookieId去标记用户 显然质量不高,如何构建访客唯一标识,沉淀更多访客信息将是数据中台重点。
情景描述
一般cookieId的生命周期为1-2个月,用户端切换账号、主动清楚cookie以及微信app重新安装都会导致cookie的丢失,为了能更多的检索出访客的历史数据,这里又引入了两个新的访客标识:帆布指纹、微信OpenId
-
微信OpenId
微信OpenId可以打通多端,多平台的访客数据;假如一个用户在手机上访问了作品A,在pad上访问了作品B,又在手机上打开了易企秀秀推小程序,传统的cookie定位方式会认为是3个用户在操作,而在微信端进行静默授权后获取到的openId是唯一的。 -
帆布指纹
帆布指纹是调用用户端设备环境进行图形渲染后hash出的字符串,如果用户端设备环境不变,即便用户清楚cookie信息 下次还能通过同样的方式再次得到,这种方式可打通同一设备多公号授权的访客信息,以及cookie清除后也能快速找回,但当浏览器内核升级、app升级以及手机系统升级都可能导致帆布指纹的变动。
构建方式
IdMapping是一种建立在两种标识之间的桥梁,通过idmapping的构建可长久定位微信端访客数据;以一个例子进行描述,当用户访问一个没有开启授权功能的作品A时,首先会从作品A获取帆布指纹Id(以下简称c_i),并将c_i作为主键存储到ES的vectors索引里,同一设备再次访问开启授权功能的作品B时会获取c_i + openId,并对库里已有数据更新,每天凌晨还会通过spark程序遍历visitors库中最近一个月有行为的数据并进行聚合,将相同c_i下的openid合并,继续通过相同openid拉取所有的c_i合并至c_i_s
数据结构如下:
PUT visitors
{
"mappings" : {
"dynamic_templates" : [
{
"strings" : {
"match_mapping_type" : "string",
"mapping" : {
"doc_values" : false,
"norms" : false,
"type" : "keyword"
}
}
}
],
"date_detection" : false,
"properties" : {
"c_i" : {
"type" : "keyword",
"doc_values" : false
},
"o_n_n" : { #微信昵称
"type" : "keyword",
"doc_values" : false
},
"o_url" : { #微信头像
"type" : "keyword",
"doc_values" : false
},
"o_sex" : {
"type" : "keyword",
"doc_values" : false
},
"o_i_s" : { #公号类型 openid
"type" : "nested"
},
"c_i_s" : { #最近更新时间 帆布id 按时间倒序排列取top
"type" : "nested"
},
"ip_s" : { #最近更新时间 ip 按时间倒序排列取top
"type" : "nested"
},
"up_time" : { #更新时间
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
},
"settings" : {
"index" : {
"refresh_interval" : "-1",
"translog" : {
"flush_threshold_size" : "2024mb",
"sync_interval" : "1200s",
"durability" : "async"
},
"store" : {
"type" : "niofs"
},
"unassigned" : {
"node_left" : {
"delayed_timeout" : "1d"
}
},
"number_of_replicas" : "1",
"codec" : "best_compression",
"search" : {
"slowlog" : {
"level" : "info",
"threshold" : {
"fetch" : {
"info" : "500ms"
},
"query" : {
"info" : "1s"
}
}
}
},
"number_of_shards" : "10"
}
}
}
此处差一张图 流程图TOO
如何获取访客历史记录
用户访问日志中依然以c_i作为标识,当要获取访客历史访问记录时,需根据当前c_i获取全量c_i_s,然后根据c_i列表去行为日志库中检索当前用户所有访问记录。
访客用户数据一年大约有10亿c_i,数据最多保留1年,up_time超出一年的数据会被从ES库中清楚,并归档到hdfs,至于10亿访客文档数据的读写优化会在下一篇文章中介绍。