这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
分布式理论
衡量故障:正确性、时间、状态、原因
六种故障模型,从处理的难易程度分类
- Byzantine failure:节点可以任意篡改发送给其他节点的数据,是最难处理的故障
- Authentication detectable byzantine failure (ADB):节点可以篡改数据,但不能伪造其他节点的数据
- Performance failure:节点未在特定时间段内收到数据,即时间太早或太晚
- Omission failure:节点收到数据的时间无限晚,即收不到数据
- Crash failure:节点停止响应,持续性的故障
- Fail-stop failure:错误可检测,是最容易处理的故障
TCP在工程上近似解决两节点间通信(两节点共识)问题
逻辑时钟为分布式事务定义时间戳
CAP理论:一致性(多个副本间)、可用性、分区容错性
数据库事务ACID理论:原子性(Atomicity)、一致性(Consistency)(事务的一致性)、隔离性(Isolation)和持久性(Durability)
事务是数据库系统中非常重要的概念,它是数据库管理系统执行过程中的一个逻辑单元,它能够保证一个事务中的所有操作要么全部执行,要么全都不执行
两阶段提交
为了使分布式系统架构下的所有节点在进行事务提交时保持一致性
pre阶段 + commit阶段
participants宕机:(某节点本地执行不成功)回滚事务
coordinator宕机:(不知道数据库此时状态)新起coordinator,查询状态后重复两阶段提交
三阶段提交
cancommit阶段 + precommmit阶段 + commit阶段
先询问是否可以执行(避免无意的写日志操作,防止资源浪费)
MVCC
悲观锁:操作数据时直接锁住,直到操作完成后释放
乐观锁:只在执行更新时,判断别人是否修改,只有在冲突时才放弃操作
MVCC维护一份数据的多个版本,为每个修改保存一个版本(与事务的时间戳相关)
微服务框架
系统设计
秒杀业务的特点:
- 瞬时流量高
- 读多写少
- 实时性要求高
秒杀的挑战:
- 资源成本
- 反欺诈(倒买倒卖)
- 高性能
- 防止超卖
- 流量管控
- 扩展性
- 鲁棒性
设计高并发系统:
- 服务无状态
- 批量写入(降低系统压力)
- 最终一致性
分布式定时任务
定时任务是指系统为了 自动 完成特定任务,实时、延时、周期性 完成特定任务的过程
分布式定时任务是把分散的、可靠性差的定时任务(业务)纳入统一的 平台 ,并实现集群管理调度和分布式部署的一种定时任务的管理方式
执行方式:
- 单机任务:随机触发一台机器完成任务(计算量小、并发度低的任务)
- 广播任务:广播到所有机器执行同一个任务
- Map任务:一个任务可以分出多个子任务(计算量大,单机无法满足)
- MapReduce任务:Map任务的扩展,可以汇总计算子任务的结果
整体架构
分布式定时任务要解决的核心问题:
触发(什么时间点)、调度(如何协调机器、调度任务)、执行
核心组件:
- 触发器Trigger 解析任务规则、生成触发事件
- 调度器Scheduler 分配任务、管理任务生命周期、管理资源调度
- 执行器Executor 干活
- 控制台Admin 提供任务管理和干预的功能
触发器
设计约束:需支持大量任务;需支持秒级调度;周期任务需要多次执行;需保证秒级扫描的高性能,避免资源浪费
多级时间轮
Trigger集群模式如何避免多次触发:
- 数据库行锁方式 触发调度先先更新数据库JobInstance状态 效率低,节点越多性能越差
- 分布式锁方式 尝试抢占分布式锁,抢锁成功才触发调度 可用Redis锁或Zookeeper锁
调度器
核心问题:资源来源、资源调度、任务执行
资源来源:业务系统(在线服务)提供 or 定时任务平台提供(消耗更多机器资源、接口调用权限问题、但可以避免相互影响并支持动态扩缩容)
资源调度:节点选择问题
- 随机节点执行
- 广播执行
- 分片执行
资源调度:任务编排(任务的前序条件)
使用有向无环图进行任务编排
资源调度:故障转移(确保部分执行单元任务失败时,任务最终成功)
分片任务基于一致性Hash策略分发任务,当某Executor异常时,调度器会将任务分发到其他Executor
调度器可以集群部署,做到完全的无状态(哪一个来调度都可以)
靠消息队列的重试机制保障任务一定会被调度
执行器
先通过机器注册 注册到调度中心
基于注册实现执行器的弹性扩缩容