【高时效通路】

一 高时效通路

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务架构-链式微服务设计模式

微服务架构-链式微服务设计模式 链式微服务设计模式&#xff08;Chain Microservice Pattern&#xff09;是一种微服务架构中的设计模式&#xff0c;它强调将一系列的服务按照特定的业务逻辑顺序串联起来&#xff0c;形成一个服务链。每个服务在链中负责完成特定的业务功能&am…

基于JSP/Servlet校园二手交易平台(二)

目录 2 开发技术及开发环境 2.1 Java语言简介 2.2 J2EE技术介绍 2.3 Servlet/JSP技术 2.4 MVC 简介 2.5 Struts 技术 2.6 Hibernate 技术 2.6.1 应用程序的分层体系结构 2.6.2 Hibernate的应用及API简介 2.7 开发环境及环境配置 2.7.1 Java/JSP系统环境 2.7.2 JSP环…

uniapp 对接 微信App/支付宝App 支付

相关文档&#xff1a;uni.requestPayment(OBJECT) | uni-app官网 示例代码&#xff1a; import qs from qsasync aliPay(){const { provider } await uni.getProvider({ service:payment })if(provider.includes(alipay)){uni.request({url:后端接口地址,data:{ //传参 },suc…

Rabbitmq 搭建使用案例 [附源码]

Rabbitmq 搭建使用案例 文章目录 RabbitMQ搭建docker 代码golang生产者消费者 可视化消费进度 RabbitMQ搭建 docker docker run -d --hostname rabbitmq --name rabbitmq -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASSadmin -e RABBITMQ_DEFAULT_VHOSTmy_vhost -e…

分类预测 | Matlab实现ZOA-SVM斑马算法优化支持向量机的多变量输入数据分类预测

分类预测 | Matlab实现ZOA-SVM斑马算法优化支持向量机的多变量输入数据分类预测 目录 分类预测 | Matlab实现ZOA-SVM斑马算法优化支持向量机的多变量输入数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现ZOA-SVM斑马算法优化支持向量机的多变量输…

5. C++网络编程-UDP协议的实现

UDP是无连接的。 UDP Server网络编程基本步骤 创建socket&#xff0c;指定使用UDP协议将socket与地址和端口绑定使用recv/send接收/发送数据 由于UDP是无连接的&#xff0c;直接侦听就行使用close关闭连接 这个UDP接收数据的时候用的API是recvfrom,发送数据是sendto 客户端 …

IS-IS链路状态数据库

原理概述 一个OSPF链路状态数据库是若干条LSA的集合。与此相似&#xff0c;一个IS-IS链路状态数据库是由若干条LSP的集合。与OSPF链路状态数据库不同&#xff0c;IS-IS链路状态数据库有Level-1和Level-2之分。 在IS-IS协议中&#xff0c;每一条LSA都有一条剩余生存时间、一个…

Behind the Code:Polkadot 如何重塑 Web3 未来

2024 年 5 月 17 日 Polkadot 生态 Behind the Code 第二季第一集 《创造 Web3 的未来》正式上线。第一集深入探讨了 Polkadot 和 Web3 技术在解决数字身份、数据所有权和去中心化治理方面的巨大潜力。 &#x1f50d; 查看完整视频&#xff1a; https://youtu.be/_gP-M5nUidc?…

Docker安装OnlyOffice

工作需要&#xff0c;多人在线编辑同一文档&#xff0c;找了一圈发现onlyoffice满足需求&#xff0c;于是使用docker安装了社区版本。下面记录下安装过程。 Onlyoffice 是什么&#xff1f; Onlyoffice 是一个多端协同的 Office 办公套件&#xff0c;相当于微软的 Office365 全…

MySQL多表关联查询习题

一、素材 -- Active: 1714203732007127.0.0.13306db_stu -- 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); -- 创建…

模块化程序设计(函数的定义、调用、参数传递、局部变量、全局变量)

函数的引入&#xff1a; 我们曾经学习了程序设计中的三种基本控制结构&#xff08;顺序、分支、循环&#xff09;。用它们可以组成任何程序。但在应用中&#xff0c;还经常用到子程序结构。 通常&#xff0c;在程序设计中&#xff0c;我们会发现一些程序段在程序的不同地方反复…

android实现PhotoShop里的魔棒效果

魔棒是画板工具一个重要的功能&#xff0c;非常实用&#xff0c;只要轻轻一点&#xff0c;就能把触摸到的颜色区域选中&#xff0c;做复制、剪切、擦除等工作。 那怎么实现呢&#xff1f; 先来看看效果&#xff1a; 要实现这个效果&#xff0c;需要对安卓canvas和paint理解比…

数据结构----堆的实现(附代码)

当大家看了鄙人的上一篇博客栈后&#xff0c;稍微猜一下应该知道鄙人下一篇想写的博客就是堆了吧。毕竟堆栈在C语言中常常是一起出现的。那么堆是什么&#xff0c;是如何实现的嘞。接下来我就带大家去尝试实现一下堆。 堆的含义 首先我们要写出一个堆&#xff0c;那么我们就需…

SQOOP详细讲解

SQOOP安装及使用 SQOOP安装及使用SQOOP安装1、上传并解压2、修改文件夹名字3、修改配置文件4、修改环境变量5、添加MySQL连接驱动6、测试准备MySQL数据登录MySQL数据库创建student数据库切换数据库并导入数据另外一种导入数据的方式使用Navicat运行SQL文件导出MySQL数据库impo…

ElasticSearch - 删除已经设置的认证密码(7.x)

文章目录 Pre版本号 7.x操作步骤检查当前Elasticsearch安全配置停止Elasticsearch服务修改Elasticsearch配置文件删除密码重启Elasticsearch服务验证配置 小结 Pre Elasticsearch - Configuring security in Elasticsearch 开启用户名和密码访问 版本号 7.x ES7.x 操作步骤 …

阿里云产品DTU评测报告(一)

阿里云产品DTU评测报告&#xff08;一&#xff09; 名词解释物联网平台控制台产品设备 DTU设备模拟器 体验评价针对业务场景&#xff0c;您觉得该产品还有哪些可改进的地方&#xff1f;什么场景下使用该产品产品的优势是什么个人建议 在正式进行DTU测评之前&#xff0c;说一点题…

【Vue】input框自动聚焦且输入验证码后跳至下一位

场景&#xff1a;PC端 样式&#xff1a; <div class"verification-code-input"><input v-model"code[index]" v-for"(_, index) in 5" :key"index" type"text" maxlength"1" input"handleInput(i…

【idea】idea2024最新版本下载_安装_破解

1、下载 下载地址&#xff1a;下载 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 下载完成&#xff1a; idea破解脚本下载链接&#xff1a;https://pan.baidu.com/s/1L5qq26cRABw8XuEn_CngKQ 提取码&#xff1a;6666 下载完成&#xff1a; 2、安装 1、双击idea的安装包&…

电赛经验分享——赛前准备

⏩ 大家好哇&#xff01;我是小光&#xff0c;想要成为系统架构师的嵌入式爱好者。 ⏩在之前的电赛中取得了省一的成绩&#xff0c;本文对电赛比赛前需要准备什么做一个经验分享。 ⏩感谢你的阅读&#xff0c;不对的地方欢迎指正。 加入小光嵌入式交流群&#xff08;qq群号&…

FPGA 纯逻辑arinc818 ip core

1、 符合FC-FS、FC-AV、FC-ADVB协议规范&#xff1b; 2、符合ARINC818协议规范&#xff1b; 3、支持光纤通信Class1、Class3服务&#xff1b; 5、可动态配置光纤端口速率&#xff0c;支持1.0625Gbps、2.125Gbps、3.1875Gbps、4.25Gbps可配置&#xff1b; 6、DDR控制接口简洁…