【高時效通路】

一 高時效通路

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.pswp.cn/web/15096.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15096.shtml
英文地址,請注明出處:http://en.pswp.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修飾…