标签

PostgreSQL , 消息平台 , 数组 , in any array


背景

一个多渠道消息平台的数据库设计。

业务规则

1、消息发送给最终用户,一则消息可以发送给多个社交软件平台(因为一个用户可能使用多个软件平台(比如旺旺,WEB版旺旺,淘宝。。。))。

  • 使用数组存储 社交软件平台

2、一条消息在某社交软件平台已读,则该消息在其他社交软件平台也需要为已读。因为同一条消息,对一个人来说,当然是任意平台已读都认为是已读。

  • 使用一个状态字段,标识是否已读

3、消息按照类型展示,透视未读数(统计什么类型的消息用户读的多,什么类型的消息用户读的少),或者按人查询未读数(当用户登陆时,查询未读消息有多少条)

  • 聚合查询,或者按UID的简单查询

4、消息存在有效期(30天,大概6亿条消息),过期不管是否已读,均删除(当然也可以设计为未读则不删除,看需求)

  • 数据老化(定期DELETE),使用任务调度。不要大批量删,会容易膨胀。

  • 《在PostgreSQL中实现update | delete limit - CTID扫描实践 (高效阅后即焚)》

  • 或者使用时间分区表。每天一个分区。建议用户自己维护分区,否则也可以用以下方法自动加分区(但是不推荐,自动的东西,而且在数据库里面自动的东西,不好维护)。

  • 《PostgreSQL 自动创建分区实践 - 写入触发器》

业务特点&技术要求

1、写入操作:消息新增(比如消息每日增量2KW)、消息状态更新(有一定的已读比例)。

2、查询请求:(查询峰值QPS 5K左右)

  • 很容易满足

3、查询条件维度:(按社交软件平台、按消息类型、按状态获取消息列表、最近一条消息、统计未读数。。。。)。

4、新增社交软件平台:社交软件平台增加时需要易于扩展。

  • 使用数组存储社交软件平台,扩展性好,无需变更结构

设计

表结构

建表

create table tbl_msg (  mesgid int8 primary key,  -- 消息ID  uid int8,  -- 用户ID  msgtype int2,  -- 消息类型  plat int2[],  -- 发给了哪些 社交软件平台,数组类型  status boolean not null default false,  -- 阅读状态  content text,  -- 内容  crttime timestamp(0) not null,  -- 消息创建时间  modtime timestamp(0)  -- 消息状态修改时间
);

优化,可以按消息类型哈希分区。减少扫描量

《PostgreSQL 9.x, 10, 11 hash分区表 用法举例》

索引

按需创建索引。

create extension btree_gin;

1、按社交软件平台查询、

create index idx_tbl_msg_1 on tbl_msg using gin (plat) where status=false;    -- 查询社交平台,某个消息类型下,未读消息  如果所有状态都想查询,则不需要 where status=false;  并把status放到索引字段里面create index idx_tbl_msg_1 on tbl_msg using gin (plat,status);

2、按消息类型、

create index idx_tbl_msg_2 on tbl_msg (uid, msgtype) where status=false;

3、按状态获取消息列表、

create index idx_tbl_msg_3 on tbl_msg (status,uid,crttime);

4、最近一条消息、

create index idx_tbl_msg_4 on tbl_msg (uid,crttime);

查询SQL

1、按社交软件平台查询、

select count(*) from tbl_msg where plat @> array[?,?,...] and status=false;

清理过期消息

单表的情况下,如何清理消息?

《在PostgreSQL中实现update | delete limit - CTID扫描实践 (高效阅后即焚)》

压测

1、每秒的写入量、更新量。10万行/s左右。

2、读取,简单SQL加分析SQL。 QPS 2万以上。

小结

用到的PostgreSQL数据库特性

1、数组类型,存储社交软件平台。

2、update,delete limit,删除过期数据

3、GIN索引,支持数组类型的高效过滤

4、分页(优化)

《论count与offset使用不当的罪名 和 分页的优化》

5、多核并行计算。数据库会根据SQL的成本、NODE自动规划是否使用并行计算,实时分析型的SQL请求非常有效。

《HTAP数据库 PostgreSQL 场景与性能测试之 23 - (OLAP) 并行计算》

6、丰富的索引接口

《PostgreSQL 9种索引的原理和应用场景》

《自动选择正确索引访问接口(btree,hash,gin,gist,sp-gist,brin,bitmap...)的方法》

PostgreSQL 消息平台实践相关推荐

  1. 阿里技术分享:电商IM消息平台,在群聊、直播场景下的技术实践

    本文由淘宝消息业务团队李历岷(花名骨来)原创分享,首次发表于公众号"淘系技术",有修订和改动. 1.引言 本文来自淘宝消息业务团队的技术实践分享,分析了电商IM消息平台在非传统IM ...

  2. 对 Kafka 和 Pulsar 进行性能测试后,拉卡拉将消息平台统一换成了 Pulsar

    拉卡拉支付成立于 2005 年,是国内领先的第三方支付企业,致力于整合信息科技,服务线下实体,从支付切入,全维度为中小微商户的经营赋能.2011 年成为首批获得<支付业务许可证>企业的一员 ...

  3. 美团点评基于 Flink 的实时数仓平台实践

    摘要:数据仓库的建设是"数据智能"必不可少的一环,也是大规模数据应用中必然面临的挑战,而 Flink 实时数仓在数据链路中扮演着极为重要的角色.本文中,美团点评高级技术专家鲁昊为大 ...

  4. 大数据主题分享第三期 | 基于ELK的亿级实时日志分析平台实践

    猫友会希望建立更多高质量垂直细分社群,本次是"大数据学习交流付费群"的第三期分享. "大数据学习交流付费群"由猫友会联合,斗鱼数据平台总监吴瑞诚,卷皮BI技术总 ...

  5. kafka 脚本发送_NWPC消息平台:在ecFlow系统中发送产品事件消息

    本文属于介绍 NWPC 消息平台 系列文章. 本文介绍如何在基于 ecFlow 构建的数值预报业务系统中发送 NWPC 消息平台的 产品事件消息. 介绍 数值预报业务系统产品制作一般分为三个步骤: 监 ...

  6. 高性能平台设计—美团旅行结算平台实践

    本文根据第23期美团技术沙龙演讲内容整理而成. 背景 美团酒旅有很多条业务线,例如酒店.门票.火车票等等,每种业务都有结算诉求,而结算处于整个交易的最后一环不可缺少,因此我们将结算平台化,来满足业务的 ...

  7. 高性能平台设计——美团旅行结算平台实践

    点击蓝字订阅,不错过下一篇好文章 本文根据第23期美团点评技术沙龙演讲内容整理而成. 酒旅有很多条业务线,例如酒店.门票.火车票等等,每种业务都有结算诉求,而结算处于整个交易的最后一环不可缺少,因此我 ...

  8. 2021爱分析・数据智能平台实践报告—重构数据智能时代的数据基础设施

    报告编委 报告指导人 黄勇 爱分析 合伙人&首席分析师 报告执笔人 洪逸群 爱分析 高级分析师 莫业林 戴甜 爱分析 爱分析 分析师 分析师 外部专家(按姓氏拼音排序) 方磊 九章云极 董事长 ...

  9. 百分点大数据技术团队:低代码平台实践

    编者按 :近两年来,低代码逐步出现在人们的视野中,特别是伴随着我国政府.企业的数字化转型,一些专注于数字化转型的厂商在集聚了相当的势能之后,大力推动了低代码的发展和行业普及.据市场调查显示,2020年 ...

最新文章

  1. Ubuntu9.10使用windows的字体的方法!
  2. 基于 python3+nginx 的 Jupyter Notebook 服务端 ssl 访问
  3. PPT资料下载 - 问题驱动的软件测试设计:强化测试用例设计
  4. 从源码全面剖析 React 组件更新机制
  5. centos7重新加载服务的命令_Centos7 systemctl添加service服务参数说明
  6. delphi 窗体的释放
  7. 任正非:华为三十年大限快到了,想不死就得新生
  8. Selenium自动化测试-7.获取元素属性信息
  9. 【TensorFlow-windows】(七) CNN之VGG-net的测试
  10. 泽众性能测试软件,软件测试工具-测试管理工具-自动化测试工具-性能测试工具-SPASVO泽众软件测试网...
  11. JAVA中加密算法的简单使用入门
  12. 第八周项目4-个人所得税计算器
  13. mapgis转arcgis
  14. bootstrap 日历
  15. 计算机桌面出现蓝色底色,桌面图标有蓝色背景的7种解决办法
  16. 数据库-mysql练习题目2
  17. c语言驻波,C版:基于声学驻波的液位检测方法C2-1(全文完整版)
  18. 懵懂新手查找区 !!! 超详细项目各个层以及内置小层的用处
  19. 1.Oracle中的表空间
  20. 如何从一个空有上进心的人,变成行动上的巨人?

热门文章

  1. 字节数与字符数mysql_数据库字段长短之字节与字符
  2. 目标检测--SSD: Single Shot MultiBox Detector
  3. GoogleNet - Going deeper with convolutions
  4. 报错解决:InvalidArgumentError: Received a label value of 101 which is outside the valid range of [0, 101
  5. Linux内核实现原子性操作cmpxchg指令的理解
  6. Linux命令行使用matplotlib,报错_tkinter.TclError: no display name and no $DISPLAY environment variable问题解决
  7. oracle中key,mysql中的key在oracle中是什么
  8. 计算机在线声音,电脑怎么在线录音
  9. 2021年普高考成绩查询,山东2021年高考成绩改为6月26日前公布
  10. php mysql orm_PHP ORM操作MySQL数据库