限流, 熔断,降级笔记
数据库主从复制包括四种:
一主一从
一主多从
互为主从
级联主从
主从复制会有延迟, 其实现方式如下, 首先主库要开启binary log, 从库开启异步IO线程同步主库日志到本地Relay日志, 开启另外线程轮询relay log, 经筛选的日志同步到从库中, 鉴于主库日志增长速度,网络,IO等原因, 从库可能数据同步有延迟.
CAP理论: 互联网公司更多的是追求AP, 牺牲C,来提高系统响应时间, 它们追求的是最终一致性.
分布式事务: 由X/Open公司提供的DTP标准(分布式事务协议),
JTA: JAVA版的DTP标准, 主要包括TM,AP,XA组成. 其中TM是核心(分布式事务管理组件)
目前开源的分布式事务主要有Atomikos/JoTM ,
分布式事务效率不高, 目前互联网公司大多避免使用, 或者绕道使用, 而是追求最终一致性,
Base理论: 是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的缩写, BASE理论是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结, 是基于CAP定理逐步演化而来的。BASE理论的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
软服务:对于未知状态提供两种方式:
1. 最大化重试
2. 衰减重试: 15S->3m->10m->30m->1h->2h->6h->15h
弱一致性可以由消息队列辅助实现.
消息队列实现时要主语幂等性,
幂等性的实现方式:
1. 数据库加上唯一性约束
2. 传参是带上token,并判断token是否重复.
3. 使用状态机, 即每次更新时检查状态机状态.
Openrestry+lua+DB实现缓存, 限流, 熔断,降级等功能.
熔断是限流的一种方式.
常见的限流算法有:
漏桶算法: 无预留容量, 能保证输出数据的稳定, 容量慢了之后直接抛弃
令牌桶算法:有预留容量, 可以容纳一定的突发容量
使用方式:
1. 使用Guava库, 直接使用两种限流算法
2. 可以由第三方中间件实现, 如Redission,(其核心是由lua脚本模拟实现)
其他限流措施包括: SQL连接池, 线程池等
线程池四种拒绝策略: Abort, Discard,DiscardOldest , Caller run