美文网首页
行为采集 之 微信端如何做IdMapping

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

作者: 郭彦超 | 来源:发表于2019-07-26 19:33 被阅读0次

    背景

    目前微信端月活已经超过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亿访客文档数据的读写优化会在下一篇文章中介绍。

    相关文章

      网友评论

          本文标题:行为采集 之 微信端如何做IdMapping

          本文链接:https://www.haomeiwen.com/subject/pjzlrctx.html