模块八作业
表设计
表设计思路
为消息队列设计两类表
一类是用来存储每个主题队列的消息内容、消息 key 和消息状态信息;
消息状态用来标识消息消费情况,可实现超时未消费成功的消息移入死信队列功能
一类是用来存储所有队列的元信息数据,如逻辑队列名、分表编号、分库编号、队列当前消费偏移量、队列最大偏移量。
按照<逻辑队列名>_<分表编号>做表明来建立消息表
按照分库编号找到对应数据库
每当插入对应队列信息表一条数据后,需要拿到偏移量 id 修改最大偏移量
每当要消费消息时,先到元信息表中查找对应消息队列的当前消费偏移量,根据当前偏移量到消息表中获取消息进行消费。
队列与表对应关系
这里采用了一个主题队列对应一张消息队列表的分表设计方案;
优点:
可以通过自增主键 id 来自动标识每个主题队列新增消息的偏移量,避免自己维护的一致性和多线程竞争问题;
多个消费者消费不同消息队列从不同的表中读取数据,提高效率,减轻高并发下单表压力;
方便后期程序拓展为消息分库分表存储;
缺点:每次新建主题,都要动态生成一张对应的消息表,并且有一定的路由策略,实现稍复杂
索引设计思路
消息表中的主键 id,同时作为队列中对应消息的消息偏移量,设置为主键 id,按偏移量查找队列中某个位置消息,效率极高。
消息表中 msg_key,建立一个普通索引,方便按照消息 key 进行查找,可实现按 key 回溯消息功能。
消息表中 create_time,建立一个普通索引,方便按照某个时间进行查找,实现按某个时间进行回溯消息。
队列元信息表中的主键 id,与业务无关,仅做主键使用
队列元信息表中有联合索引 QUEUE_TABLE_INDEX,顺序为 <quque_name><db_id><tab_id>,
按此顺序,可以方便的按照队列名或者队列名+数据库 id+表 id 进行快速查找对应队列的元信息属性。
评论