天天看點

驚天性能!單執行個體RDS PostgreSQL 支撐 2000億 實時标簽透視案例

PostgreSQL , varbitx , 标簽 , 任意圈選 , 阿裡雲 , RDS , bitmap , 分段 , 并行計算 , 異步調用 , dblink , 異步dblink , 遊标

20億使用者,每個使用者1000個标簽,基于任意标簽組合圈選、透視(業務上的需求是一次最多計算100個标簽的組合)。

相當于要處理2000億記錄。

1、實時求标簽組合的記錄數。(即滿足标簽組合的使用者有多少)

2、使用者ID。(級滿足标簽組合的使用者ID。)

要求實時響應。

通常你肯定會想,這個至少需要上百台機器來支撐。

但是我要給你一個驚喜,這個資料量,一台RDS PG執行個體即可。怎麼做呢?聽我道來,用最少的資源解決業務問題,用到RDS PG黑科技。

方案如下:

<a href="https://github.com/digoal/blog/blob/master/201712/20171212_01.md">《阿裡雲RDS PostgreSQL varbitx實踐 - 流式标簽 (閱後即焚流式批量計算) - 萬億級,任意标簽圈人,毫秒響應》</a>

1、bitmap切段

2、計算滿足條件的USER COUNT值時,并行計算(使用dblink異步調用)

3、求使用者ID時,使用遊标,流式傳回。

1、需要用到的插件

2、建立标簽表,切段,例如20億個使用者,切成400段,每一段5000萬個使用者BIT。

3、建立索引(限制)

4、建立1000個标簽的BITMAP資料,每一個标簽400條,每條的BIT長度為5000萬位。

5、建立生成dblink連接配接的函數,重複建立不報錯。

6、AND标簽組合的并行計算函數(dblink 異步并行),傳回USERID透視數。

7、OR标簽組合的并行計算函數(dblink 異步并行),傳回USERID透視數。

8、AND,OR 标簽組合的并行計算函數(dblink 異步并行),傳回USERID透視數。

9、計數透視的性能如下,50個标簽組合,僅1.5秒,100個标簽組合,僅2.6秒:

我們統計2000億個user_tags組合(每個使用者一條記錄,每條記錄1000個标簽時的換算),僅僅需要2.6秒。

10、AND 、 OR組合性能如下,性能一樣:

11、求USERID,AND 函數如下,我們為了達到高速響應,使用遊标傳回。

12、求USERID,OR 函數如下,我們為了達到高速響應,使用遊标傳回。

13、求USERID,AND OR 函數如下,我們為了達到高速響應,使用遊标傳回。

14、求USERID例子,88毫秒響應,極端速度。

擷取遊标值,5000萬ID,僅692毫秒:

15、如果我們把位置翻譯放到用戶端做,那麼隻需要擷取結果BITMAP,那就更快了,224毫秒就可以擷取5000萬BIT走。 這塊也能做成并發,每個用戶端擷取不同的ofid。

varbitx是阿裡雲RDS PG提供的一個插件,使用它,單個RDS PG就可以實作萬億級别USER_TAGS的實時圈選。

使用BITMAP分段、DBLINK異步查詢、遊标等技術,提高性能。

性能名額:

1、求COUNT,2000億(20億使用者,100個标簽組合)USER_IDS,響應速度2.6秒。

2、求USERID明細,傳回5000萬使用者ID位置,僅692毫秒。

3、求USERID明細,如果隻傳回BITMAP,5000萬個BIT僅需224毫秒。

<a href="https://github.com/digoal/blog/blob/master/201705/20170502_01.md">《阿裡雲RDS for PostgreSQL varbitx插件與實時畫像應用場景介紹》</a>

<a href="https://github.com/digoal/blog/blob/master/201610/20161021_01.md">《基于 阿裡雲 RDS PostgreSQL 打造實時使用者畫像推薦系統(varbitx)》</a>