Java分布式架构知识框架教案
2022-10-13 10:28:02 0 举报
AI智能生成
Java分布式架构知识框架教案
作者其他创作
大纲/内容
主题订阅模式,消息经由交换机通过routing key绑定到队列,需要注意<b><font color="#f15a23">一条消息只能消费一次</font></b>
topic
广播模式,消息经由交换机直接发向和交换机绑定的所有队列,routing key无效
fanout
直连模式,这种模式也可以说是种默认模式,当你连交换机都懒得创建的时候,这种模式使用的是默认交换机,它和fanout模式的区别除了交换机不同,就是当向该交换机发送一条消息时,与它绑定的队列只有一个能消费到
direct
这种几乎用不到,它是通过请求信息中,请求头包含的信息进行消息区分
header
四种通信模式
RabbitMQ
高吞吐低延迟mq,适用用大数据量的流式传输,如日志传输,用户活动跟踪,运营指标等
Kafka
apache开源mq中间件,消息堆积能力不足,一般不考虑
ActiveMQ
阿里开源的mq中间件,支持事务
无状态节点,存储注册信息,可集群部署
NameServer
存储消息队列
Broker
生产者
Producer
消费者
Consumer
组成
RocketMQ
分布式消息通信
常用kv结构,用来缓存数据
string
将信息凝聚在一个key中,可以进行统一的删除,缺点是设置过期时间只能在key上,不能对key对应的数据设置过期;优点是避免了命名冲突,减少内存消耗
hash
无重复数据的集合,可用作抽奖,存放点赞的人,可以进行交集,并集,差集的计算;可以用来实现共同关注的人,可能认识的人等功能;甚至可以用来对账
set
有序的无重复数据集合,可以用在时事热点信息的排序上
zset
可以用作消息列表使用
list
基本数据类型
memcache适合以KV的缓存为主,数据量,并发业务量大的场景,它支持多线程操作,充分利用CPU,但缓存不能持久化
Redis拥有丰富的数据类型,可以做到缓存持久化,宕机更容易数据恢复,在单线程的效率比memcache快
memcache VS redis
适用于可以接受缓存穿透的场景,即去掉缓存也不影响业务正常进行的应用
单机
哨兵模式提供了主从的监控,当主服务宕机后,从服务能快速切换成主服务,适合缓存高可用场景,缺点是不易扩容
哨兵
适合于大数据量的高可用缓存场景,集群模式内存和QPS不受限于单机,可用于横向扩展
通信采用gossip协议,请求逐步打到各个节点上,有一定延迟,但集群压力比较小
集群
部署三种模式
几乎实时的备份,通常设置1秒备份一次
备份方式
通过记录命令重复执行进行恢复数据,效率较低,但数据比较全
恢复方式
AOF
每隔一段时间用子线程进行全量备份
直接数据的传输覆盖,数据不全
RDB
持久化类型
持久化
对于设置了expire过期时间的key,到了key的过期时间会立即删除
概述
保证内存尽快释放,保证过期的准时性
优点
若过期key很多,删除这些key会比较消耗CPU时间
每设置一个过期时间会创建一个定时器,大量定时器会比较影响性能
缺点
定时删除
对于到期的key,不会立即删除,根据定期策略设置的时间,到了之后会检查key是否过期,若过期则删除
通过限制删除操作的时长和频率,来减少对CPU时间的占用
会造成一定的内存占用
定期删除
对过期的key不做删除处理,当再次通过key来获取值的时候,会检查key是否过期,过期则删除
删除操作只发生在通过key取值的时候,占用CPU较少
可能比定期删除还要占用内存,若大量数据缓存而不再调用,可能导致内存溢出
惰性删除
过期策略
虚拟桶是一种取模和一致性哈希折中的办法,直接取模会导致数据和节点紧密关联,缺乏灵活扩展;一致性hash在扩容或缩容情况下,部分数据需要重新计算节点
扩容直接分离一部分槽给新的机器就能达到扩容效果
槽个数是固定的,需要根据实际情况预先定下槽的数量,redis cluster槽数量是16384个
Redis Cluster数据分部算法Hash slot(虚拟桶)
大量请求同一个数据,由于数据不存在,请求都访问数据库,导致数据库崩掉
缓存不存在时,数据库返回null值也存入缓存,之后直接通过缓存返回null的处理办法
解决办法
缓存穿透
大量缓存在同一时间失效,请求都打到数据库,导致数据库崩掉
并发压力大通过加锁或队列,当缓存失效时,对某个key只允许一条线程访问,其它等待
缓存失效时间设置不同,可以在一个时间范围乘个随机数,尽量分布均匀
加二级缓存,二级缓存失效时间大于一级缓存,当一级缓存失效,二级缓存可以起到作用
如果能预计到某个时间点会有大量并发操作,可以设计手动reload缓存
缓存雪崩
系统启动时对热点数据进行缓存主动加载
缓存预热
常见问题
Redis分布式缓存
mysql主从复制与读写分离
mysql+keepalived实现双主高可用
mysql分库分表
分库分表利器
数据库中间件Mycat
MySQL
数据存储
zookeeper之所以流行,很大程度上得益于国内dubbo使用的是zookeeper作为其注册中心,然而zookeeper是个CP模型架构,我们的服务更多时候需要实现的是AP模型,也就是高可用,它是天然相冲的;由于这些原因,阿里现在也推出了nacos注册中心用来替代zookeeper成为dubbo的注册中心
配置管理服务
分布式协调中心
分布式锁
发布订阅
leader选举
功能
概念和使用详解
zookeeper
nginx
Spring Cloud 大家庭的一员,使用git托管配置文件,没有管理界面,若要实现自动更新需要加上mq、bus,实现复杂依赖多,还不好用(本人用过,后来弃了改用apollo^_^)
Spring Cloud Config
携程开发的配置管理中心,只依赖数据库,较为流行的配置中心
Apollo
阿里最近加大力度推广的新开源配置中心,和dubbo配合较好,也支持SpringCloud,可能会是以后的流行趋势
Nacos
百度的开源配置中心,似乎逐渐没落,依赖较多
disconf
淘宝曾经的配置中心,不维护了,pass
diamond
配置中心
分布式架构中间件
面向服务的架构,依赖ESB企业级总线
SOA架构
是对SOA的升级,将业务系统彻底的服务化组件化,依赖于网关分配,充分利用协调资源
微服务架构
SOA架构和微服务架构
C(Consistency):一致性,表示所有节点上的数据必须保持同步
A(Availability):可用性,所有请求必定会得到响应,但不保证正确性
P(Partition tolerance):分区容错性,系统应该持续提供服务,即使系统内部有服务挂了,不会彻底死机
cap理论指出一个分布式系统不可能同时满足一致性、可用性和分区容错性,这三个要求只能同时满足其中两项
CAP理论
BASE全称Basically Available(基本可用),Soft state(软状态)和Eventually consistent(最终一致性)
比如数据库分片,其中一片挂了,剩余仍可以使用
比如当大流量访问时,只允许部分用户访问,其它用户降级处理
在分布式系统出现故障时,允许瞬时部分可用性
Basically Available(基本可用)
比如支付过程,待支付,支付中,支付成功,支付失败,那么支付中就是个中间状态,在成功之后同步状态存在一定延迟
表示数据存在中间状态,允许在不同节点的数据副本在同步过程中存在延迟
Soft state(软状态)
表示所有数据副本在一段时间的同步后最终达到一致的状态
Eventually consistent(最终一致性)
BASE理论
failover快速失败
选址DNS
f5等
硬件负载
lvs
HAProxy
软件负载
gossip(redis-cluster使用)
去中心化的软件负载
负载均衡技术
热备(Linux HA)
多机房(同城灾备、异地灾备)
避免单点故障
CPU、内存监控
链路监控
日志监控
故障监控,自动预警
服务降级、限流、快速失败等
应用容错设计、自我保护
数据分片
读写分离
数据量
应用高可用
比如业务垂直拆分成多个微服务,优先考虑
垂直伸缩
比如数据库单表数据量过大,根据业务条件水平拆表到多个表
水平伸缩
提升硬件性能
增加服务器
可伸缩设计
加速静态内容访问速度
CDN
应用的分批发布
灰度发布
高可用设计
分布式架构设计
流行用setnx方法,设置成功则获取锁,redis可以设置过期时间
实现方式
第一是在setnx方法之后,设过期时间之前redis宕机仍然可能死锁,且过期时间不好定;第二redis通常都是主从部署,可以看出redis是AP模型,而分布式锁需要实现CP模型,明显是不可实现的,具体表现在,如果在主节点A获取到了锁,此时还没同步到从节点B,主节点宕机,那么B从节点会变成主节点,此时其他服务是又可以获取分布式锁的
redis
zk通过添加同名节点成功者获取锁的方式实现,使用它的临时节点方式,可以在一个会话结束后自动释放节点,也就不存在需要定时释放的问题,哪怕程序异常断开了连接,节点没了会话维持也会自动失效
zk的强一致性使得在zk节点越多的情况下,获取分布式锁越慢,且在存在leader机器宕机的时候,zk的ZAB一致性协议会使zk集群暂时无法提供服务,直到选出leader,并恢复数据
zk可以创建顺序节点,使用zk的watch机制,可以实现公平锁
通过表主键判断,插入成功获取锁,缺点明显,数据库IO是比较消耗性能的,不可重入,不可定时释放
数据库
速度快,直接内存操作生成
不需要依赖第三方接口
实现简单
只能趋势递增(考虑如果是订单,可以通过订单id来推测订单量)
依赖机器时间,如果机器时间回拨可能导致生成id重复
snowflow
每次去数据库获取一个号段的值,用完再去获取
Leaf-segment数据库方案
解决时钟回拨问题
Leaf-snowflake
Leaf美团点评分布式ID生成系统
每次取回一批id自己用
uid-generator百度
全局ID生成方案
随着微服务调用链越来越复杂,急需一个调用链监控工具来进行监控和查找问题,google首先发布了一篇调用链论文Dapper,后续有人根据该论文推出了一系列开源项目
随着开源调用链产品增多,为了多语言结合不同调用链产品的兼容性,一个开源组织对调用链进行了规范,称为OpenTracing协议
Dapper,google的调用链实现,未开源
开源的调用链实现工具,现在已是SpringCloud的一个组件,支持开源协议OpenTracing
zipkin
也是国外一个开源软件
jaeger
国内的开源组件,非侵入字节码增强方式
skywalking
非侵入字节码增强方式进行调用链监控,不需要埋点
pinpoint
点评开发的一款链路追踪,具有更多的表报聚合数据展示
cat
方案
调用链监控
使用nginx的ip_hash策略保证同一个用户始终访问同一个服务器
使用数据库存放session,可以保证session持久化,不过在微服务情况下,各个微服务有自己的数据库这就不好用了
cookie存储session,这样每次请求都会携带session信息,消耗资源,不推荐
redis存储session,可以使用spring-session框架,它重写了httpSession
session共享
分布式架构解决方案
Java分布式架构知识框架教案
0 条评论
下一页