廣告倒排索引架構與優化

来源:https://www.cnblogs.com/dingaimin/archive/2019/09/15/11523812.html
-Advertisement-
Play Games

倒排索引架構 在廣告系統中倒排索引起著至關重要的作用,當請求過來時,需要根據定向信息從倒排索引中匹配合適的廣告。我們的倒排索引採用的是ElasticSearch(後面簡稱ES),考慮點是社區活躍,相關採集、可視化、監控以及報警等組件比較完善,同時ES基於java開發,所以調優和二次開發相對方便 先看 ...


倒排索引架構

在廣告系統中倒排索引起著至關重要的作用,當請求過來時,需要根據定向信息從倒排索引中匹配合適的廣告。我們的倒排索引採用的是ElasticSearch(後面簡稱ES),考慮點是社區活躍,相關採集、可視化、監控以及報警等組件比較完善,同時ES基於java開發,所以調優和二次開發相對方便

先看下我們的倒排索引的架構圖

file

這個架構設計成如上圖這樣,經過了下麵的思考與迭代

索引問題與優化

單點與穩定性問題

採用多節點部署

其中 A builder和 B builder都是兩個節點,一個主和一個備,他們通過爭搶鎖(用zookeeper實現)來決定誰是主

多個節點會帶來數據不一致問題

  1. 多生產者多消費者產生消息時序問題

    把消息設置成無狀態的

file

查詢資料庫獲取最新數據(訂單和創意更新頻率低,所以對資料庫壓力不大)

  1. 因為出異常導致數據不一致

    採用重試(冪等)和定時任務處理異常

  2. 全量更新索引,影響線上索引查詢功能

    採用主備索引

    主備索引切換流程:更新備用索引->驗證備用索引->主備切換->更新主索引

    file

索引查詢與重建索引問題與優化

壓測ES QPS不高、CPU負載高、YGC頻繁、索引重建索引耗時長

我們分別從查詢和重建兩個方向來看

查詢

  1. 1s一次YGC,STW約10ms,對低延遲系統影響較大

    調整 -Xmn 3g->7g,調整後10s一次YGC,STW約12ms

    調整前YGC頻繁,對低延遲系統影響較大,所以想增大YGC的時間間隔,降低性能抖動,考慮到YGC採用複製演算法,每次垃圾回收時間主要包括掃描年輕代存活對象和複製存活對象,掃描對象的成本遠低於複製對象,所以YGC的時間主要取決於存活對象的數量,在對象生命周期沒有較大變化的情況下,YGC的時間自然不會有較大變化

    調整後,YGC的時間間隔有了很大改善,GC時間並沒有線性增加

  2. 調整分片數和副本數,減少線程損耗、較少IO

    ES預設分片數是5,預設條件下,索引會被分配到不同的節點,這樣每個節點只有部分索引,會導致一次請求需要合併多個節點的數據,IO數多

    如圖所示,假設有3個節點,2個主分片,每個分片有一個副本。當一次查詢過來的時候

    查詢流程大致為:首先是node3收到請求,它可能會把請求轉發到node2的R0或node1的P0,然後完成檢索後把數據彙集到node3,最後返回。其中每個索引的內部,數據會保存到多個segment中,而對segment的查詢是串列的

file

而我們的場景是請求量大,索引小(100M以內),所以把主分片調整為1,副本調整為節點數-1,這樣能保證每個節點都存儲所有索引,這樣只會有一次io操作,如下圖所示

file

  1. ES(lucencu) 串列讀取所有segment

    索引更新會使segment數量增加,es對segment的查詢是串列的,所以我們採用每分鐘定時用 _forcemerge將segment降為1

  2. 熱點方法排查發現JSON反序列化占50%cpu

    禁用source只採用field存儲必要欄位

  3. 指定查詢偏向本機節點

    設置preference:_local

重建

  1. 全量重建前關閉從分片,禁用實時索引

    replicas:0 refresh_interval:-1

    減少索引在重建過程中索引同步帶來的消耗

  2. 批量重建索引

    使用 bulk批量重建索引,提高建索引的性能

後記

我們採用的方案,有些並不符合業界常用和推薦的方式,但是符合我們自己的業務,所以方案一定要適合自己團隊的業務,沒有最好的方案,只有更適合的方案


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • iconfont的使用: "https://www.cnblogs.com/changxin7/p/11479216.html" Bootstrap介紹 Bootstrap是Twitter開源的基於HTML、CSS、JavaScript的前端框架。 它是為實現快速開發Web應用程式而設計的一套前端工 ...
  • 分組元素用於對頁面中的內容進行分組。 figure元素和figcaption元素 figure 元素用於定義獨立的流內容(圖像、圖表、照片、代碼等),一般指一個獨立的單元。 figure 元素的內容應該與主內容相關,但如果被刪除,也 不會對文檔流產生影響 。 figcaption 元素用於為figu ...
  • 1.let作用域局限於當前代碼塊 代碼1: let作用域僅限於當前代碼塊,而var的作用域是全局的 2.let作用域不會被提升 代碼2: let作用域不會被提升,而var作用域會被提升 代碼2相當於: 3.let不能被重覆定義 代碼3: 上面這段代碼運行會報錯:Identifier 'str2' h ...
  • 前言 vue通信手段有很多種,props/emit、vuex、event bus、provide/inject 等。還有一種通信方式,那就是 $attrs 和 $listeners,之前早就聽說這兩個api,趁著有空來補補。這種方式挺優雅,使用起來也不賴。下麵例子都會通過父、子、孫子,三者的關係來說 ...
  • [TOC] 1.DOM樹介紹 DOM:文檔對象模型。DOM 為文檔提供了結構化表示,並定義瞭如何通過腳本來訪問文檔結構。目的其實就是為了能讓js操作html元素而制定的一個規範。 DOM就是由節點組成的:HTML載入完畢,渲染引擎會在記憶體中把HTML文檔,生成一個DOM樹。 在HTML當中,一切都是 ...
  • 一、使用方法: 因為map標簽是與img標簽綁定使用的,所以我們需要給map標簽添加ID和name屬性,讓img標簽中的usemap屬性引用map標簽中的id或者name屬性(由於瀏覽器的不同,usemap屬性接收二者之一的值,所以通常name和id屬性二者都寫,值相同),並配合area標簽進行使用 ...
  • [TOC] 1.javascript介紹 1.1Web前端有三層: HTML:從語義的角度,描述頁面 結構 CSS:從審美的角度,描述 樣式 (美化頁面) JavaScript:從交互的角度,描述 行為 (提升用戶體驗) 1.2其中JavaScript基礎又分為三個部分: ECMAScript:Ja ...
  • 介紹 前文初始篇 "C++ 深入淺出工廠模式(初始篇)" ,主要闡述了簡單工廠模式、工廠方法模式和抽象工廠模式的結構、特點和缺陷等。以上三種方式,在新增產品時,要麼修改工廠類,要麼需新增具體的工廠類,說明工廠類的封裝性還不夠好。 本文進階篇,主要是將工廠類的封裝性提高,達到新增產品時,也不需要修改工 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...