架构实战营模块八作业
表名设计
日期_topic_表序号,如 20220729_topic_00001,日期为当天的日期,每天都创建新表;topic 为消息主题;表序号为当天创建的第几张表,每个表有固定的容量,如 1000 万行,超过了就要创建新表。
字段设计
(1)seq_no,消息在当前 topic 中的序号;
(2)data,varchar 类型,存放消息数据;
索引设计
每张表的 seq_no 为主键索引,递增加 1;
设计思路
(1)尽量顺序操作磁盘;
(2)每个 topic 单独建表的原因,当订阅者要某 topic 数据时,数据库是顺序读,性能好;每个表有固定的容量,要某序号数据时可以很容易判断出在哪张表里;
(3)表名带日期的原因,当需要删除旧数据时,直接根据表名的日期 drop 表即可,效率高;
(4)消息写库设计,应用服务器缓存一定量的消息加超时逻辑,采取批量写的方式,根据 topic 进行批量写,这样就能顺序写磁盘,性能好;但是业务上需要能够容忍主点宕机,应用服务器中缓存的还没批量写库的数据丢失。超时时间可以设置的短一点,缓存量上限也可以设置的少一些,根据业务的特性;
(5)seq_no 加索引的原因,当订阅者想订阅某序号以后的消息时,可以通过索引快速定位到所要序号的数据位置,避免全表扫描。
评论