写点什么

架构实战营模块 8 课后作业

用户头像
En wei
关注
发布于: 1 小时前

前言

这次作业做得比较早。

题目

设计消息队列存储消息数据的 MySQL 表格

【作业要求】

1.包括表名、字段、索引;

2.用文字描述设计思路和理由,例如:为什么设计某个索引?

3.一页 PPT 即可

【提示】

1.需要考虑每个消息队列一张表,还是所有消息放一张表,里面加一个“队列名称”的字段。

题目分析

之前课上已经介绍过消息队列的业务背景了,作为一个自研的消息队列支持团队内部的业务即可。当时提出的 TPS 大概是 2W?这个指标确实是记不太清楚了,但由于消息队列需要大量的写入,而 mysql 单台的 TPS 写入支持不了太高,所以数据分片是肯定需要的。

简单描述

1. Java 语言编写消息队列服务器

2. 消息存储采用 MySQL

3. SDK 轮询服务器进行消息写入

4. SDK 轮询服务器进行消息读取

5. MySQL 双机保证消息尽量不丢

6. 使用 Netty 自定义消息格式,并且支 持 HTTP 接口

基本架构

如下图所示。

从上面的信息来看,主要业务场景就是传递消息,发送者将消息发送到消息队列,接收者将从消息队列读取消息。写入的话比较简单,直接追加即可。

但读取的时候比较复杂,可能要读取最新的一条数据或是读取最近的某几条数据,那么可能需要类似于 kafaka 的偏移量,记录客户端读到哪里了,可以将消息从队列的指定位置读出来。

所以这里面首要涉及到的概念就是消息,需要元素主要包括


  • 存储消息内容 payload

  • 发送者 sender

  • 时间 createTime

  • 主键 id

  • 队列名称 queueName


还需要一个就是连接信息,这个用来记录客户端读取的进度,需要频繁更新所以需要更新时间,主要包括:

  • 主键 id

  • 客户端编码,clientCode

  • 客户端 ip,clientIp

  • 读取到的消息 id,offset

  • 队列名称,queueName

  • 创建时间,createTime

  • 更新时间,updateTIme


关键设计点,每个消息队列一张表,主要是没有跨队列的查询需求,而且降低冲突的概率,有利于提高系统的写入和查询的性能。

所以消息表中就不需要消息队列名称这一属性了,因为表名就包含了这个信息。


索引设计主要是为了提高查询速度,分为查询消息和查询进度两种情况讨论。

  • 查询消息,主要是依靠自增主键就可以了,PS 题外话,由于采用了数据分片,数据库的自增主键可能用不了了,这里可以使用 snowflake 算法来生成。

  • 查询进度即查询连接信息表,主要是根据队列名称和客户端来联合查询,并只需要最近修改的即可,所以设置队列名称和客户端 code 联合索引,再加上更新时间的倒序索引。


正式回答


关键设计点,每个消息队列一张表,主要是没有跨队列的查询需求,而且降低冲突的概率,有利于提高系统的写入和查询的性能。

消息表

【表名】

消息队列名称,不同的表来表示不同的消息队列

【表结构】

  • 存储消息内容,payload,TEXT

  • 发送者,sender,VARCHAR

  • 时间,createTime,TIMESTAMP

  • 主键,id,bigint

【索引】

id 作为主键


连接信息表

【表名】

client_connection

【表结构】

  • 主键,id,bigint

  • 客户端编码,clientCode,VARCHAR

  • 客户端 ip,clientIp,VARCHAR

  • 读取到的消息 id,offset.BIGINT

  • 队列名称,queueName,VARCHAR

  • 创建时间,createTime,TIMESTAMP

  • 更新时间,updateTIme,TIMESTAMP

【索引】

  • clientCode 和 queueName 联合索引,

  • updateTIme 倒序索引。


学习分享

转眼间已经来到了模块 8 的作业,这次是作业算是比较简单的,但也不知不觉写了两个小时- -!。

模块 8 主要是讲了集群设计相关的理论和技巧,接受起来相对比较容易,最复杂的当属几个集群算法了,实际上只需要记住“世界上只有一种分布式一致性算法,那就是 paxos,其余都是 paxos 的劣化版”,用的时候实际上 raft 更多一些也更成熟一些。

2021 的下半年已经开始了,希望能够取得一些突破。

发布于: 1 小时前阅读数: 4
用户头像

En wei

关注

还未添加个人签名 2017.12.10 加入

还未添加个人简介

评论

发布
暂无评论
架构实战营模块8 课后作业