RPC分布式扩展

229 阅读2分钟

Dubbo 集群容错

  • 失败自动切换
    • 可能会重复写入
  • 快速失败(失败直接报错)
  • 失败安全(直接忽略失败,类似日志)
  • 失败自动恢复(后台记录失败请求,定时重发)
  • 并行调用多个机器
  • 广播调用所有机器

Dubbo 负载均衡

  • 随机,按权重

  • 轮循,但是会出现请求卡在速度比较慢的机器上的问题

  • 最少活跃调用数,相同活跃数的随机,性能好响应快的多分请求

  • 一致性hash,相同参数的请求发到同一台数据

    • 会出现hash偏房的问题,使用虚拟节点

    image.png

Dubbo 最佳实践

  • 分包
  • 粒度
    • 服务接口尽可能大粒度
  • 版本
    • 每个接口都应该定义版本号
  • 兼容性
    • 服务接口增加方法,可向后兼容,但是删除方法删除字段,将不兼容,需要通过变更版本号升级。
  • 枚举值
    • 返回值里面新增枚举值,也会造成不兼容,需要先升级服务的消费方
    • 入参新增枚举值,建议先升级提供方
  • 序列化
    • 参数建议使用对象进行传参
  • 调用
    • 要合适的边界上使用try catch,防止漏掉一些错误

分布式事务

  • CAP理论
    • C: 强一致性(大部分公司会牺牲这个)
    • A:可用性
    • P:分区容错性
  • zk满足CAP中的CP
    • 超过半时的机器返回ack,才会认为已经提价成功
    • 挂不超过一般的机器,都可以继续使用
    • zk主进程挂了的时候,选举出leader之前是不可用的,不满足可用性

2CP(两阶段提交)

  • 先发prepare,所有机器返回yes,才会发commit请求

    image.png

TCC(try comfire cancel)

  • try和confire有问题,就会发cancel请求,进行回滚

    image.png

本地消息事件+消息队列(保证数据的最终一致性)

  • 消息本地事件表

  • 定时任务队列轮循

    image.png

    • 本地事务和消息事件设置在同一个事务里
    • 本地事务和消息事件存储在两个表中
    • 定时任务定时去消息时间表拉取未发送的消息发送给MQ
    • MQ给消费方发送事务
    • MQ发送成功或失败,都给定时任务返回状态,定时任务根据状态去修改消息事件表中的消息状态,从而能够重发送失败消息