Dubbo 集群容错
- 失败自动切换
- 可能会重复写入
- 快速失败(失败直接报错)
- 失败安全(直接忽略失败,类似日志)
- 失败自动恢复(后台记录失败请求,定时重发)
- 并行调用多个机器
- 广播调用所有机器
Dubbo 负载均衡
-
随机,按权重
-
轮循,但是会出现请求卡在速度比较慢的机器上的问题
-
最少活跃调用数,相同活跃数的随机,性能好响应快的多分请求
-
一致性hash,相同参数的请求发到同一台数据
- 会出现hash偏房的问题,使用虚拟节点
Dubbo 最佳实践
- 分包
- 粒度
- 服务接口尽可能大粒度
- 版本
- 每个接口都应该定义版本号
- 兼容性
- 服务接口增加方法,可向后兼容,但是删除方法删除字段,将不兼容,需要通过变更版本号升级。
- 枚举值
- 返回值里面新增枚举值,也会造成不兼容,需要先升级服务的消费方
- 入参新增枚举值,建议先升级提供方
- 序列化
- 参数建议使用对象进行传参
- 调用
- 要合适的边界上使用try catch,防止漏掉一些错误
分布式事务
- CAP理论
- C: 强一致性(大部分公司会牺牲这个)
- A:可用性
- P:分区容错性
- zk满足CAP中的CP
- 超过半时的机器返回ack,才会认为已经提价成功
- 挂不超过一般的机器,都可以继续使用
- zk主进程挂了的时候,选举出leader之前是不可用的,不满足可用性
2CP(两阶段提交)
-
先发prepare,所有机器返回yes,才会发commit请求
TCC(try comfire cancel)
-
try和confire有问题,就会发cancel请求,进行回滚
本地消息事件+消息队列(保证数据的最终一致性)
-
消息本地事件表
-
定时任务队列轮循
- 本地事务和消息事件设置在同一个事务里
- 本地事务和消息事件存储在两个表中
- 定时任务定时去消息时间表拉取未发送的消息发送给MQ
- MQ给消费方发送事务
- MQ发送成功或失败,都给定时任务返回状态,定时任务根据状态去修改消息事件表中的消息状态,从而能够重发送失败消息