System Design 产品与项目Java技术升华

一文读懂字节跳动“埋点验证平台”

2023-01-07  本文已影响0人  涅槃快乐是金

序言

埋点数据作为推荐、搜索、产品优化的基石,其数据质量的重要性不言而喻,而要保障埋点数据的质量,埋点验证则首当其冲。工欲善其事必先利其器,要做好埋点验证会面临很多技术挑战:易用性、准确性、实时性、稳定性、扩展性,如何攻克这些挑战呢,其实还是技术,这也是本文的主旨所在。目前埋点验证已在字节内部得到广泛使用,通过一键扫码开启验证、实时上报验证、自动生成验证报告,解决了埋点数据验证难、埋点质量保障难的问题。
埋点验证流程埋点生命周期:4+6

{
    "app_id":100,
    "event":"click",
    "params":{
        "enter_from":"login",
        "duration":1,
        "type":3
    }
}

埋点规则:

{
    "app_id":100,
    "event_name":"video_play",
    "logical_filter":{
        "enter_from":"login"
    },
    "meta":{
        "required_field":[
            "duration",
            "enter_from",
            "type"
        ],
        "scene":{
            "condition":"enter_from=login",
            "name":"登录页"
        },
        "validate_field":[
            "duration",
            "enter_from",
            "type"
        ]
    },
    "physical_validation":"{\"$schema\":\"https://json-schema.org/draft/2019-09/schema\",\"type\":\"object\",\"properties\":{\"params\":{\"type\":\"object\",\"properties\":{\"duration\":{\"type\":\"integer\"},\"enter_from\":{\"type\":\"string\",\"enum\":[\"login\"]},\"type\":{\"type\":\"integer\",\"enum\":[1,2,3]}},\"required\":[\"duration\",\"enter_from\",\"type\"]}},\"required\":[\"params\"]}",
    "source":"schema_scene"
}

埋点规则字段说明

规则选择器

规则选择器将依据“埋点”中的关键信息,从“验证规则池”中选择出对应的“埋点验证规则”。

准确性

埋点验证结果准确、用户可信
埋点验证引擎必须保证埋点验证结果的准确性,才能降低验证成本。针对埋点数据本身的格式验证,我们采用了JsonSchema作为验证手段,以支持完善的验证规则、可信的验证结果。上文中的“规则生成器”、“规则选择器”、“埋点验证器”也都在一定程度上保证了埋点验证结果的准确性。

埋点方案 event:video_play

埋点规则jsonSchema

{
    "$schema":"https://json-schema.org/draft/2019-09/schema",
    "type":"object",
    "properties":{
        "params":{
            "type":"object",
            "properties":{
                "duration":{
                    "type":"integer"
                },
                "enter_from":{
                    "type":"string",
                    "enum":[
                        "login"
                    ]
                },
                "type":{
                    "type":"integer",
                    "enum":[
                        1,
                        2,
                        3
                    ]
                }
            },
            "required":[
                "duration",
                "enter_from",
                "type"
            ]
        }
    },
    "required":[
        "params"
    ]
}

埋点数据event:video_play

{
    "app_id":100,
    "event":"click",
    "params":{
        "enter_from":"login",
        "duration":1,
        "type":3
    }
}

验证结果event:video_play

image.png image.png

实时性

埋点数据实时可见
埋点验证场景下,服务端和验证平台需要频繁地进行数据交互,所以我们自建了Push服务(基于WebSocket的封装),能够保证数据的实时畅通性

Push服务目标

  1. 基于WebSocket实现一套通用长连接通讯协议,能实现同一个客户端上的不同业务共享同一个长连接通道,并实现可靠的心跳机制。

  2. 客户端和服务端基于通用长连接通讯协议实现一个稳定可靠的全双工通道。

  3. 客户端实现一个通用的SDK,服务端实现一个通用接入层。

  4. 客户端SDK,服务端接入层,都要很方便后续service接入。

  5. Push服务定期做打点监控,同时开放http的Admin接口,方便系统的监控和查看服务状态

    Push服务优势

  6. 连接稳定性:Push服务分为两个组件Push和Backone,实现了业务和推送解耦。push面向客户端连接,设计尽可能简单,需保持大量客户端活跃连接,避免了业务服务更新时不影响客户端连接

  7. 服务隔离性:不同的业务服务接入push服务,会根据接入信息做集群隔离,避免业务之间互相影响

  8. 横向扩展性:当业务服务不断增多时,只需对push服务做横向扩容即可支持

    Push服务流程

    image.png

稳定性

埋点数据可靠不丢失

SLA

  1. 定义:服务级别协议(service-level agreement,即SLA)是服务提供方与客户之间的正式承诺,用来量化服务水平(质量、可用性、责任)

  2. 埋点验证服务:服务的特征是实时,所以衡量埋点验证不可用的手段是“数据延迟”,即埋点从“上报”->“验证平台”的p99超过3s即视为不可用,日常p99在1s


    image.png

    措施

    为了保证“SLA”,我们做了一系列的保护措施
    日志转换器:客户端、服务端、web 端上报的是原始日志格式,需要转换为埋点验证日志格式后进行验证


    image.png image.png

    扩展性

    快速接入新的埋点数据格式

  3. 提供可插拔的“日志转换器插件”,服务高内聚,可支持各种日志格式快速接入、验证


    image.png

展望

埋点验证是保障埋点质量的有效方式,此方式属于事前验证,适用于埋点频繁变化的业务场景,需要一定程度的人工介入,能够解决基本的埋点质量问题。但是对于核心埋点场景来说,这种方式的验证成本较高,需要重复的人力投入,为了解决核心埋点验证成本高的问题,我们正在探索落地其他方式:

立即跳转火山引擎大数据研发治理套件产品官网了解详情!

上一篇 下一篇

猜你喜欢

热点阅读