【高时效通路】

一 高时效通路

1.1 pathchdumper

实时数据拉取、实时数据处理、5分钟微批dump来加速时效性,具体来说:

  1. 实时数据拉取(Fetcher):基于Databus Fetcher基建,直接对接F0层实时拉取最新数据,保证该节点常态秒级延迟;
  2. 实时数据处理(AdTable):面向Databus数据格式,有效实践是类似于BS广告库服务,基于AdTable实时加载和用户UDF能力保证数据处理秒级延迟;
  3. 5分钟微批dump(Logger):新增Logger功能,通过记录增量数据触发的表结构变化,并经过数据格式转换形成下游所需增量文件;
  4. 数据固化(Uploader):复用Databus Uploader基建,将5分钟级Patch文件写入AFS。

说人话:

  • 定时执行heart_beat操作(可配置),对全局idea_map进行遍历(跟随ideatable更新),根据status对大宽表进行insert、remove

  • insert/remove的过程中执行logger,将大宽表数据存入buffer,buffer以idea_id为key,在dump固化到磁盘前,再次logger,新数据可覆盖旧数据

  • loader读增量文件至文件切换时dump buffer中数据,固化到磁盘

  • uploader上传文件至afs

    1.1.1 为何使用大宽表
    • 一条完整的广告增量是<winfo, idea>,而不是某个单一层级,这就决定了高时效通路中需要有可做层级join的能力。一条广告是基于idea层级从同unit下优选出一条winfo

    • ann建库时最终用户(数据使用方)拿到的是一条完整Join好的有效数据。这意味着,下游拿到的一条Patch数据Record中,包含了有效的Idea层级、Unit层级、Plan层级数据

    1.1.2 Heartbeat如何工作

    custom_heart_beat的具体逻辑:

    定期执行heart_beat操作(可配置),对全局idea_map进行遍历,根据其status对大宽表进行增删改

    主函数 custom_heart_beat(FeedBsTables* p_handle)

    遍历全局创意map, for (auto& [idea_id, status] : context._global_idea_map)

    然后判断idea对应的状态标记

    1. 状态为需要移除

    • 从宽表中删除该广告
    • 从全局的创意映射表中移除该创意

    2、状态为其他

    • 插入、更新、无变化,调用completeness_check方法进行检查, completeness_check(p_handle, status.first, idea_id);

    其中,completeness_check函数

    1. get_common_info读取广告基础信息(user_id、plan_id、unit_id、user_main_version、plan_main_version、unit_main_version、winfo_main_version)

    2. 校验USER、PLAN、UNIT、WINFO 四个层级的version,通过check_version函数进行主辅表verison状态判断:

      1. 辅表version不存在(辅表已下发删除增量),需要删除业务宽表VERSION_UNEQUAL_REMOVE

      2. 主辅表version相同,表示字段没有变动VERSION_EQUAL

      3. 主辅表version不相等, 需要更新业务宽表VERSION_UNEQUAL_UPDATE

    3. 判断主辅表状态

      1. 如果结果是VERSION_UNEQUAL_REMOVE

        1. 表示辅表join失败不做操作

        2. return 0;

      2. 如果结果是VERSION_UNEQUAL_UPDATE

        1. 如果在宽表中的一定不是新广告, 仅更新version

        2. 1. winfo优选choose_best_winfo_id

          1. 优选条件 target_type == 32 && intent_type == 16 && intent_name_id == 999999, 表示智能定向广告

          2. 不符合则随机抽一条

        3. 2. 业务宽表字段填充fill_wide_idea_tuple

        4. 3. 多样性控制winfo_customer_control

          1. get_freq, 使用map实现频率计数,并设定key的过期时间

        5. 4. 新广告插入到业务宽表中 p_handle->wide_idea_table()->insert(tuple);

        6. 5. version更新update_version

    dump服务中,dump的框架需要能够实现周期性 dump base,patch数据的能力,以及根据业务需求可以根据定期(按照处理条数或时间间隔)触发提条heartbeat消息的能力,这样业务可以根据 heartbeat 消息来实现一些特定的业务逻辑。

    那么 trigger 应该由谁来触发呢?

    • 对于业务需求的 heartbeat 而言,则需要单独增量一个条数和时间的计数器,以便在到达用户配置的条件时,生成一条heartbeat数据,该逻辑在 loader 中实现也比较合理。

    综上,需要在 loader 中增加 trigger 的能力,来 cover 上述场景。

    trigger 只需要在加载增量时进行触发即可(应该会有返回值,告诉上游,什么时候可以开始启动服务了)

    1.1.3 Logger是如何实现的

    对于patch 数据,我们是需要记录下对 table 的修改,相当于记录一个 log。 log则是以5分钟的粒度(和增量文件的粒度对接)进行组织。

    增量数据到来后,会对两类Table 进行修改: MemDataTable 和 IndexTable,因此我们只需要对这两类 Table 的 modify接口进行封装,在数据更新时,将数据同时也更新到patch logger 中,就可以实现对table的修改记录。

    • MemDataTable的 modify 接口包括:

      • insert(tuple)

      • remove(tuple)

    • IndexTable 的 modify接口包括:

      • insert(key, tuple)

      • remove(key)

    为了保证数据记录Patch Logger的性能,需要在内部为每个需要 dump 的table 配置一个buffer(buffer 大小可配,不同 table可以配不同的 buffer size)。当 buffer满时,可以自动 spill 到本地磁盘。在 trigger patch dump 时,会将 buffer全部 flush 到本地磁盘。因为 Loader 在处理增量时是单线程的,所以当 Loader 触发 dump 时,上一条数据已经被处理完,不会有数据丢失的问题。

    Buffer 用HashMap来实现,这样,对于同一个 key 对应的数据,我们可以只保留最新的一个修改,以实现一定程度的 compaction。注意:这里如果一次 patch数据量过多,可能生成多轮 buffer,那么最终的dump 文件中还是可能造成数据的重复的。

    1.1.4 patchdump何时工作

    5分钟增量文件读完后开始dump

    • 我们希望 patch的粒度可以和databus 的增量文件对齐,那么loader 来触发 adtable 的 dump 是一个很直接的想法。当loader可以识别到增量文件的切换,当文件发生切换时,向 PatchLog 发送一次 dump 请求,PatchLog将本次Patch的数据 flush到本地目录。

    • 对于base dump,为了可以和 patch 的时间对齐,同样也使用增量文件的切换来触发 base 数据的 dump,即,当前一个5分钟的增量文件处理完成后,此时满足需要 dump 的周期,则触发一次table表的dump到本地目录。

1.1.3 不同表的版本同步问题

CDC(Change Data Capture)数据同步:

  • https://en.wikipedia.org/wiki/Change_data_capture

  • Change Data Capture (CDC): The Complete Introduction | Confluent

基准:ETL

独立业务宽表的方案,将主表和基于主表的业务宽表独立。

[流程图]

如图所示,在这种方案中,我们一共有三种表:

  1. 主表:IdeaTable。该表包含所有主表的业务字段,此外还需要存储相关Right Join辅表的数据版本version。

  2. 辅表:Right Join的业务表,如UnitTable,PlanTable。该表包含辅表自身的业务字段,此外还包含没调记录的数据version。

  3. 业务大宽表:业务大宽表为最终的业务方也需要的物理实体宽表,该表对接Logger,用于产出最终分片,其上挂载了业务方所需要的所有主表和辅表Field。

1.2 processor

1.3 xct

1.4 indexplus

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot整合Minio对象存储超级详细讲解以及配置搭建

windows环境下搭建minio步骤 1.从minio官网进行查看详细信息 地址&#xff1a;https://min.io/里面有详细的配置信息搭建成功之后如下如所示&#xff1a;用户名密码默认情况下为 username&#xff1a;minioadmin password&#xff1a;minioadmin2.搭建成功之后的访问 地址&…

python - 分割 pytest 的 conftest.py 文件

解决 pytest 的 conftest.py 文件过大问题。 1. 项目目录结构 project_name ├── LICENSE ├── MANIFEST.in ├── Makefile ├── README.md ├── project_name │ ├── __init__.py │ ├── testing │ │ ├── __init__.py │ │ ├── fixtur…

vue项目实战 - 如果高效的实现防抖和节流

在Vue项目中&#xff0c;处理高频事件的优化至关重要&#xff0c;直接影响用户体验和应用性能。防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;是两种常用且有效的方法&#xff0c;可以控制事件触发频率&#xff0c;减少不必要的资源消耗。如何在…

SEO优化,小白程序员如何做SEO优化流量从0到1

原文链接&#xff1a;SEO优化&#xff0c;小白程序员如何做SEO优化流量从0到1 1、SEO是什么&#xff1f; SEO即&#xff1a;搜索引擎优化(Search Engine Optimization)&#xff0c;是一种通过优化网站结构、内容和外部链接等因素&#xff0c;提高网站在搜索引擎中的自然排名&…

python爱心树表白代码

以下是一个使用Python的turtle模块来绘制一颗爱心并表白的简单示例代码&#xff1a; import turtle import math # 设置屏幕 screen turtle.Screen() screen.bgcolor("black") # 绘制爱心 def draw_heart(t, size): t.speed(9) t.penup() t.goto(0, -size…

Python Minio 工具类封装

最近因为需要对大规模的文件进行存储&#xff0c;选了多种对象存储方案&#xff0c;最终选择了MinIO&#xff0c;为了方便python的调用&#xff0c;在minio第三方包的基础上进行进一步封装调用&#xff0c;该工具除了基础的功能外&#xff0c;还封装了多线程分片下载文件和上传…

DeepDriving | CUDA编程-03:线程层级

本文来源公众号“DeepDriving”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;CUDA编程-03:线程层级 DeepDriving | CUDA编程-01&#xff1a; 搭建CUDA编程环境-CSDN博客 DeepDriving | CUDA编程-02&#xff1a; 初识CUDA编程-C…

Linux之共享内存mmap用法实例(六十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

外卖霸王餐返利外卖会员卡小程序开发

外卖霸王餐返利外卖会员卡小程序开发 "社交电商赋能下的外卖返利小程序"是专为商家与用户双赢而设计的创新平台。 以下是其开发方案的详细步骤&#xff1a; 一、需求梳理&#xff1a;首先&#xff0c;我们需要明确小程序的核心功能和特色。包括设定活动类型、返利…

Python学习(3) 函数

定义 定义一个函数的格式&#xff1a; def 函数名(参数):执行代码如果没有参数&#xff0c;则称为无参函数。 定义时小括号中写的是形参&#xff08;形式参数&#xff09;&#xff0c;调用时写的是实参&#xff08;实际参数&#xff09;。 调用 调用格式&#xff1a; def…

【Docker】Linux 系统(CentOS 7)安装 Docker

文章目录 对 VMware 软件的建议官方说明文档Docker安装卸载旧版本docker设置仓库开始安装 docker 引擎最新版 Docker 安装指定版本 Docker 安装&#xff08;特殊需求使用&#xff09; 启动 Docker查看 Docker 版本查看 Docker 镜像设置 Docker 开机自启动 验证开机启动是否生效…

自定义原生小程序顶部及获取胶囊信息

需求&#xff1a;我需要将某个文字或者按钮放置在小程序顶部位置 思路&#xff1a;根据获取到的顶部信息来定义我需要放的这个元素样式 * 这里我是定义某个指定页面 json&#xff1a;给指定页面的json中添加自定义设置 "navigationStyle": "custom" JS&am…

新时代AI浪潮下,程序员和产品经理如何入局AIGC领域?

当下&#xff0c;AI浪潮席卷全球&#xff0c;AIGC大模型技术已经成为当今技术领域的一个重要趋势&#xff0c;对于产品经理来说&#xff0c;掌握这项技术不仅能够增强他们的职业技能&#xff0c;还能在竞争激烈的职场中脱颖而出。 为什么呢&#xff1f; 把握AI时代的机遇 AI技…

StringMVC

目录 一&#xff0c;MVC定义 二&#xff0c;SpringMVC的基本使用 2.1建立连接 - RequestMapping("/...") ​编辑 2.2请求 1.传递单个参数 2.传递多个参数 3.传递对象 4.参数重命名 5.传递数组 6. 传递集合 7.传递JSON数据 8. 获取url中数据 9. 传递文…

怎么通过OpenAI API调用其多模态大模型(GPT-4o)

现在只要有额度&#xff0c;大家都可以调用OpenAI的多模态大模型了&#xff0c;例如GPT-4o和GPT-4 Turbo&#xff0c;我一年多前总结过一些OpenAI API的用法&#xff0c;发现现在稍微更新了一下。主要参考了这里&#xff1a;https://platform.openai.com/docs/guides/vision 其…

python数据类型之元组、集合和字典

目录 0.三者主要作用 1.元组 元组特点 创建元组 元组解包 可变和不可变元素元组 2.集合 集合特点 创建集合 集合元素要求 集合方法 访问与修改 子集和超集 相等性判断 集合运算 不可变集合 3.字典 字典特点 字典创建和常见操作 字典内置方法 pprin模块 0.…

k8s——Pod详解

一、Pod基础概念 1.1 Pod定义 Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行…

缪尔赛思又来到了你的面前(哈希)

定义一棵根节点为 1 1 1&#xff0c; n ( 2 ≤ n ≤ 1 0 3 ) n(2≤n≤10^3) n(2≤n≤103) 个节点的树的哈希值为&#xff1a; H ∑ i 1 n X i Y f a ( i ) m o d 998244353 H∑^n_{i1}X^iY^{fa(i)}\ mod\ 998244353 Hi1∑n​XiYfa(i) mod 998244353 f a ( i ) fa(i) fa(i)…

断网之后的页面,Autox.js是点击还是上下滑动比较好?

在处理断网之后的页面&#xff0c;选择点击还是上下滑动作为刷新操作&#xff0c;取决于应用的设计和用户界面。通常&#xff0c;这两种操作都可以作为刷新页面的方式&#xff0c;但它们各自有不同的适用场景&#xff1a; 点击刷新 - 适用场景&#xff1a;如果应用提供了一个明…

Java进阶学习笔记7——权限修饰符

什么是权限修饰符&#xff1f; 就是用来限制类中的成员&#xff08;成员变量、成员方法、构造器、代码块....&#xff09;能够被访问的范围。 protected使用的比较少&#xff0c;但是程序员还是要阅读代码&#xff0c;看官方文档是怎么写的&#xff0c;都会接触到protected修饰…