天天看点

惊天性能!单实例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>