高并发redis-mysql架构设计

高并发redis-mysql架构设计


流程

总体设计

  1. 针对非事务
  2. 针对dao方法
  3. 针对单个sql
    高并发redis-mysql架构设计_第1张图片

dao代理

高并发redis-mysql架构设计_第2张图片

高并发redis-mysql架构设计_第3张图片

  1. 方法请求:
    处理指定注解的方法,如果该方法没有注解,就走一般流程(AOP实现),(要考虑到除了注解还有配置方式)
    如果注解解析异常返回,设置执行对象的状态30001

  2. dao代理接口

    1. 操作类型解析,如果异常就不执行下面的步骤,设置执行对象的状态30002,并返回给方法请求
    2. 操作类型解析成功后,获取到执行对象—>初始化补偿表状态30000
  3. 操作类型解析,解析方法的请求类型,和请求参数,解析成功后,设置执行对象的初始状态30000。

    1. 组装key,默认提供key生成规则,和自定义key生成规则(提供可扩展接口)
    2. 新增类型:如果redis没有对应的主键,同步mysql的主键+1,如果有主键值,主键值+1,这一版本不做
    3. 修改类型:根据key更新数据,不考虑维护键关系
    4. 删除类型:根据key删除数据,不考虑维护键关系
    5. 查询类型:根据key查询数据,不考虑维护键关系,且不初始化
  4. 执行对象

    1. 发送请求给redis处理器,并等待返回的执行对象,根据返回对象更新补偿表,如果连接异常,设置执行对象的状态30003
    2. 发送请求给MQ(异步),如果连接异常,设置执行对象的状态30004
    3. 发送请求补偿表,如果连接异常,设置执行对象的状态30013
  5. 整体做事务(redis事务)

Redis处理器设计

高并发redis-mysql架构设计_第4张图片
高并发redis-mysql架构设计_第5张图片

  1. dao代理:

    1. 发送请求给redis处理器,并等待返回的执行对象,根据返回对象更新补偿表,如果连接异常,设置执行对象的状态30003
  2. Redis处理器:(要考虑reids处理器的高可用)

    1. 返回执行对象给dao代理
  3. 请求类型解析curd

    1. 如果解析异常,设置执行对象的初始状态30005
    2. 新增类型:如果redis没有对应的主键,同步mysql的主键+1,如果有主键值,主键值+1,这一版本不做
    3. 修改类型:根据key更新数据,不考虑维护键关系
    4. 删除类型:根据key删除数据,不考虑维护键关系
    5. 查询类型:根据key查询数据,不考虑维护键关系
  4. 同步mysql

    1. 只要考虑查询的情况
    2. 如果查询查不到数据,请求sql处理器获取数据,按照key生成规则,同步数据到redis
  5. 执行redis读写

    1. 对redis操作,不管成功失败,都对执行对象设置对应的状态码
  6. 更新补偿表

    1. 根据执行redis读写后的执行对象,更新补偿表,这里注意防止dao代理的重复更新补偿表。
  7. 整体做事务(redis事务)

sql处理器设计

高并发redis-mysql架构设计_第6张图片
高并发redis-mysql架构设计_第7张图片

  1. sql处理器

    1. 请求MQ连接,消费MQ里面的消息(任务id),只要消费,MQ消息就丢弃一条
    2. 获取到任务id,到补偿表获取任务id对应的具体信息
  2. 执行

    1. 解析消息
    2. 考虑现有的数据库Dao接口,不改动代码情况下,执行调用dao。(反射实现,或者定义一个消费消息表(redis))
      1. 消费消息表设计:MQ解析任务id,通过任务id从消费消息表中解析获取具体的dao()
      2. 反射实现:核心参数
        1. 任务id
        2. 全类名
        3. 方法名
        4. 参数
    3. 只执行redis处理器处理成功的数据,(查补偿表对应的状态数据)
    4. 不管成功或者失败,通过执行结果更新补偿表,(定时修复处理那边需要这里的数据)
    5. 控制sql的执行频率(线程池)
      1. 执行频率:检测sql的cpu,内存,连接数,动态设置执行频率,默认
      2. 用户自定义执行频率
  3. 补偿表

    1. 根据执行结果,更新补偿表
  4. 整体做事务(redis事务)

定时修复处理器

高并发redis-mysql架构设计_第8张图片

  1. 定时修复处理器

    1. 获取补偿表的数据,这里有存在连接异常。如果连接异常,切换任一台机器的补偿表(补偿表的高可用)
    2. 对数据就行解析处理
    3. 修复的数据来源sql处理器和redis处理器
  2. sql处理器

    1. 修复数据
    2. 修复状态
      1. 成功:删除补偿表数据
      2. 失败
        1. (sql执行失败,非连接问题):

          1. 记录执行的sql
          2. 给人发送邮件(配置方式,web管理方式,权限配置)
          3. 给人发送短信(配置方式,web管理方式,权限配置)
          4. 将要修复的数据从补偿表中迁移到其他表(修复错误补偿表)
          5. 提供人工修复接口(接口要做权限,安全配置)
        2. (sql执行失败,连接问题)

          1. 连接问题,mysql连接失败,给响应的人员发送短信通知
        3. 修复数据是分层次的,先让运营人员调用修复接口修复,还不能成功,在让开发人员去修复。

  3. 整体做事务(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

  1. 默认策略,前缀+按照参数名称排序生成key+后缀.
    1. 案例: order_id+(price+userName)+order
  2. 用户定义策略(实现某个接口就可以)

启动阶段

将相关的数据同步到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数据不同步
动作:

你可能感兴趣的:(架构)