高并发redis-mysql架构设计
流程
总体设计
- 针对非事务
- 针对dao方法
- 针对单个sql
dao代理
-
方法请求:
处理指定注解的方法,如果该方法没有注解,就走一般流程(AOP实现),(要考虑到除了注解还有配置方式)
如果注解解析异常返回,设置执行对象的状态30001 -
dao代理接口
- 操作类型解析,如果异常就不执行下面的步骤,设置执行对象的状态30002,并返回给方法请求
- 操作类型解析成功后,获取到执行对象—>初始化补偿表状态30000
-
操作类型解析,解析方法的请求类型,和请求参数,解析成功后,设置执行对象的初始状态30000。
- 组装key,默认提供key生成规则,和自定义key生成规则(提供可扩展接口)
- 新增类型:如果redis没有对应的主键,同步mysql的主键+1,如果有主键值,主键值+1,这一版本不做
- 修改类型:根据key更新数据,不考虑维护键关系
- 删除类型:根据key删除数据,不考虑维护键关系
- 查询类型:根据key查询数据,不考虑维护键关系,且不初始化
-
执行对象
- 发送请求给redis处理器,并等待返回的执行对象,根据返回对象更新补偿表,如果连接异常,设置执行对象的状态30003
- 发送请求给MQ(异步),如果连接异常,设置执行对象的状态30004
- 发送请求补偿表,如果连接异常,设置执行对象的状态30013
-
整体做事务(redis事务)
Redis处理器设计
-
dao代理:
- 发送请求给redis处理器,并等待返回的执行对象,根据返回对象更新补偿表,如果连接异常,设置执行对象的状态30003
-
Redis处理器:(要考虑reids处理器的高可用)
- 返回执行对象给dao代理
-
请求类型解析curd
- 如果解析异常,设置执行对象的初始状态30005
- 新增类型:如果redis没有对应的主键,同步mysql的主键+1,如果有主键值,主键值+1,这一版本不做
- 修改类型:根据key更新数据,不考虑维护键关系
- 删除类型:根据key删除数据,不考虑维护键关系
- 查询类型:根据key查询数据,不考虑维护键关系
-
同步mysql
- 只要考虑查询的情况
- 如果查询查不到数据,请求sql处理器获取数据,按照key生成规则,同步数据到redis
-
执行redis读写
- 对redis操作,不管成功失败,都对执行对象设置对应的状态码
-
更新补偿表
- 根据执行redis读写后的执行对象,更新补偿表,这里注意防止dao代理的重复更新补偿表。
-
整体做事务(redis事务)
sql处理器设计
-
sql处理器
- 请求MQ连接,消费MQ里面的消息(任务id),只要消费,MQ消息就丢弃一条
- 获取到任务id,到补偿表获取任务id对应的具体信息
-
执行
- 解析消息
- 考虑现有的数据库Dao接口,不改动代码情况下,执行调用dao。(反射实现,或者定义一个消费消息表(redis))
- 消费消息表设计:MQ解析任务id,通过任务id从消费消息表中解析获取具体的dao()
- 反射实现:核心参数
- 任务id
- 全类名
- 方法名
- 参数
- 只执行redis处理器处理成功的数据,(查补偿表对应的状态数据)
- 不管成功或者失败,通过执行结果更新补偿表,(定时修复处理那边需要这里的数据)
- 控制sql的执行频率(线程池)
- 执行频率:检测sql的cpu,内存,连接数,动态设置执行频率,默认
- 用户自定义执行频率
-
补偿表
- 根据执行结果,更新补偿表
-
整体做事务(redis事务)
定时修复处理器
-
定时修复处理器
- 获取补偿表的数据,这里有存在连接异常。如果连接异常,切换任一台机器的补偿表(补偿表的高可用)
- 对数据就行解析处理
- 修复的数据来源sql处理器和redis处理器
-
sql处理器
- 修复数据
- 修复状态
- 成功:删除补偿表数据
- 失败
-
(sql执行失败,非连接问题):
- 记录执行的sql
- 给人发送邮件(配置方式,web管理方式,权限配置)
- 给人发送短信(配置方式,web管理方式,权限配置)
- 将要修复的数据从补偿表中迁移到其他表(修复错误补偿表)
- 提供人工修复接口(接口要做权限,安全配置)
-
(sql执行失败,连接问题)
- 连接问题,mysql连接失败,给响应的人员发送短信通知
-
修复数据是分层次的,先让运营人员调用修复接口修复,还不能成功,在让开发人员去修复。
-
-
整体做事务(redis事务)
执行对象设计(executeO)
核心字段
Integer operationType:操作类型,curd,目前新增不做
String taskId:任务id,跟踪整个流程
Class classFullName:代理的class,反射
String method:代理的方法,反射
Objectp[] args:代理的方法参数,反射
Integer status:状态,与补偿表的补偿机制有关
String key:redis的key
String description:描述
object returnMessage:返回的消息体
Class returnType:返回的消息类型,封装返回的消息
Long createId:创建人ID
Date createTime:创建时间
Long modifyId:修改人ID
Date modifyTime:修改时间
key生成规则策略
提供对外接口,先扫描有没有用户自定义策略,如果有就加载自定义策略,否则加载默认策略。bean或者配置的方式都可以
执行该接口的方法生成key
- 默认策略,前缀+按照参数名称排序生成key+后缀.
- 案例: order_id+(price+userName)+order
- 用户定义策略(实现某个接口就可以)
启动阶段
将相关的数据同步到redis中
注意限流(多线程)
补偿表设计
字段
状态
备注(mysql处理数据的时候,备注结果)
任务id
操作类型
参数
类名
方法名
MQ设计
只记录任务id
异常状态状态
30000:补偿表初始化状态
30001:注解解析异常
30002:操作类型解析异常
30003:请求redis处理器异常,连接异常
30004:请求MQ异常,连接异常
30005:redis请求类型解析异常
30006:redis连接异常
30007:redis数据删除异常
30008:redis数据更新异常
30009:补偿表连接异常异常
30010:执行sql异常
30011:redis处理器执行成功
30012:sql处理器执行成功
30013:初始化补偿表异常
各个状态生成条件或影响
30000:补偿表初始化状态
生成条件:只有操作类型是修改或者删除,并且成功创建了执行对象
影响:只有初始化补偿表,后面模块才能更新
动作:初始化补偿表
30001:注解解析异常
生成条件:解析方法注解的时候发生
影响:dao代理无法执行下去,这一个过程出现异常直接返回给方法调用。
动作:
30002:操作类型解析异常
生成条件:dao代理解析操作类型阶段
影响:dao代理无法执行下去,这一个过程出现异常直接返回给方法调用。
动作:
30003:请求redis处理器异常,连接异常
生成条件:执行对象创建成功,连接redis处理器时候
影响:补偿表有初始化,但后面redis处理器,sql处理器,修复处理器没法更新对应的任务,补偿表的key应该有失效机制(过期)。
动作:重连机制,重连无效,调用补偿表key失效机制
30004:请求MQ异常,连接异常
生成条件:redis处理器已经返回正确的数据后,连接MQ
影响:这个时候补偿表状态已经更新为30011。需求sql同步结果
动作:重连机制,重连无效,更新补偿表状态为手动补偿30014,返回redis处理器的执行结果
30005:redis请求类型解析异常
生成条件:redis处理器解析请求类型的时候
影响:补偿表有初始化,但后面redis处理器,sql处理器,修复处理器没法更新对应的任务,补偿表的key应该有失效机制(过期)
动作:调用补偿表key失效机制
30006:redis连接异常
生成条件:redis连接
影响:补偿表有初始化,但后面redis处理器,sql处理器,修复处理器没法更新对应的任务,补偿表的key应该有失效机制(过期)。
动作:重连机制,重连无效,调用补偿表key失效机制
30007:redis数据删除异常
生成条件:redis处理器删除操作的时候。
影响:补偿表有初始化,但后面redis处理器,sql处理器,修复处理器没法更新对应的任务,补偿表的key应该有失效机制(过期)。。
动作:调用补偿表key失效机制
30008:redis数据更新异常
生成条件:redis处理器更新操作的时候。
影响:补偿表有初始化,但后面redis处理器,sql处理器,修复处理器没法更新对应的任务,补偿表的key应该有失效机制(过期)。
动作:调用补偿表key失效机制
30009:补偿表连接异常异常
生成条件:连接补偿表的时候,目前补偿表放在redis中,也就是该异常是redis连接异常
影响:可能发生在初始化接口,也可能发生在其他更新补偿表阶段
动作:重连机制,重连无效,调用补偿表key失效机制,
30010:执行sql异常
生成条件:sql处理器执行阶段
影响:已产生了redis处理的正确数据,需要同步sql
动作:更新补偿表状态为手动补偿30014,返回redis处理器的执行结果
30011:redis处理器执行成功
生成条件:redis处理器执行成功,获取正确数据
影响:影响dao代理是否发送MQ,影响sql处理器是否同步sql,影响修复处理器是否修复数据。
动作:
30012:sql处理器执行成功
生成条件:sql处理器执行成功,获取正确数据
影响:影响修复处理器是否修复数据。
动作:
30013:初始化补偿表异常
生成条件:dao代理初始化补偿表
影响:针对更新和删除操作
动作:
30014:补偿表手动补偿异常
生成条件::sql处理器执行阶段
影响:定时修复处理器处理这种异常
动作:
30014:补偿表更新异常
生成条件:补偿表更新状态的时候
影响:可能redis,sql数据不同步
动作: