行为采集 之 微信端如何做IdMapping

2019-07-26  本文已影响0人  郭彦超

背景

目前微信端月活已经超过11亿,借助微信生态起家的公司不计其数;易企秀作品访客日志90%是微信端贡献的,每天3-4千万的pv访问量, 如果只是通过cookieId去标记用户 显然质量不高,如何构建访客唯一标识,沉淀更多访客信息将是数据中台重点。

情景描述

一般cookieId的生命周期为1-2个月,用户端切换账号、主动清楚cookie以及微信app重新安装都会导致cookie的丢失,为了能更多的检索出访客的历史数据,这里又引入了两个新的访客标识:帆布指纹、微信OpenId

构建方式

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亿访客文档数据的读写优化会在下一篇文章中介绍。

上一篇下一篇

猜你喜欢

热点阅读