版权声明:话不在多,在于精 https://blog.csdn.net/qq_29857681/article/details/90578534
- 集群 是一个 1+1 > 2 的模式
- 最开始有1台服务器,随着流量的增加 不能只单单增加一个服务器,而是同时还要增加一个管理者服务器
- 集群本身也是一种分片 可以实现高容量,高并发,高可用(三高)
- 管理者服务器的三种模式
- 代理模式 增加代理服务器控制后面服务器的选取
- 名称服务器
- 将服务节点的地址存储在名称服务器中,服务节点的变更会同步到名称服务器
- 请求者获取所有服务节点地址,直连服务节点
- 主从模式
- 主服务器保存所有从服务的地址信息
- 请求发送到主服务器后,主服务器进行路由选取,返回服务地址,请求端直连从服务器
数据量,访问量增大后的问题及解决
- 多个业务查询一个库,是一种耦合,会增大数据库的压力,应该垂直拆分
- 问题: 引发了分布式事务
- 单表存储量大 mysql上限2000w
- 数据表量大,水平拆分
- 系统方面
- 路由策略
- 主键防重
- 分页 排序
消息中间件
好处:异步和解耦
灵感突现:要尽量保护数据库,不让外部应用感受到数据库的存在(对核心数据加解密,异步同步缓存,搜索)
中间件分类(主要解决共性问题)
- 服务调用和治理
- 消息中间件
- 数据访问中间件
灵感突现:不读历史,你就不知道你现在用的技术的好处,万物皆如此
ReentrantLock比synchronize的好处
- trylock
- 公平锁
- 读写锁
synchronized与volatile的异同
同:
synchronized可以做主存与线程副本之间的同步,volatile只有主存
- 将数据从主存复制到线程副本
- 将数据从线程副本同步到主存
异:
synchronized可以做互斥
加锁的方式有5种 synchorized lock countdownlatch 栅栏 信号量
信号量主要是为了细粒度的控制并发量
服务分组好处是机器分组 服务隔离
解决jar包冲突最好的办法是自定义class loader 实现类加载隔离
超时 其实就一个定时任务 超时后调用回调函数响应超时
远程调用的四种方式 Oneway不关心结果 2 被动回调 3 future 主动控制超时 4 可靠异步就是消息中间件
rpc的过程 路由 编码 代理 网络 限流 解码 反射 返回
消息中间件
如何保证消息发送一致性
也就是业务操作成功后,消息一定会发出去 ,业务失败,消息一定发不出去
- 先将消息写入中间件库 状态为待处理
- 然后调用业务操作,
- 如果成功后 将消息改为待发送,失败的话 删除消息
原生JMS消息模型
点对点: 消息只会被一个应用消费,一个应用消费了,另一个应用就不能再次消费了
发布订阅:消费者可以独立收到所有到达Topic的消息
如何保证不同集群互不干扰的消费各自消息,及集群内部不同的连接不重复消费消息?
集群id:对各个连接以集群id分组
点对点模型:在集群内部使用点对点模型,一个应用消费了 其他应用不能消息
如何保证消息的可靠性
持久订阅:即使应用宕机了,消息也会被保存,等应用恢复后,继续消费
持久传输和非持久传输最大的区别是:采用持久传输时,传输的消息会保存到磁盘中(messages are persisted to disk/database),即“存储转发”方式。先把消息存储到磁盘中,然后再将消息“转发”给订阅者。当Borker宕机 恢复后,消息还在