读大型网站系统与Java中间件实践(曾宪杰)感悟

版权声明:话不在多,在于精 https://blog.csdn.net/qq_29857681/article/details/90578534
  1. 集群 是一个 1+1 > 2 的模式
    1. 最开始有1台服务器,随着流量的增加 不能只单单增加一个服务器,而是同时还要增加一个管理者服务器
  2. 集群本身也是一种分片 可以实现高容量,高并发,高可用(三高)
  3. 管理者服务器的三种模式
    1. 代理模式     增加代理服务器控制后面服务器的选取
    2. 名称服务器
      1. 将服务节点的地址存储在名称服务器中,服务节点的变更会同步到名称服务器
      2. 请求者获取所有服务节点地址,直连服务节点
    3. 主从模式
      1. 主服务器保存所有从服务的地址信息
      2. 请求发送到主服务器后,主服务器进行路由选取,返回服务地址,请求端直连从服务器

数据量,访问量增大后的问题及解决

  1. 多个业务查询一个库,是一种耦合,会增大数据库的压力,应该垂直拆分
    1. 问题: 引发了分布式事务
  2. 单表存储量大 mysql上限2000w
    1. 数据表量大,水平拆分
  3. 系统方面
    1. 路由策略
    2. 主键防重
    3. 分页 排序

消息中间件

好处:异步和解耦

灵感突现:要尽量保护数据库,不让外部应用感受到数据库的存在(对核心数据加解密,异步同步缓存,搜索)

中间件分类(主要解决共性问题)

  1. 服务调用和治理
  2. 消息中间件
  3. 数据访问中间件

灵感突现:不读历史,你就不知道你现在用的技术的好处,万物皆如此

ReentrantLock比synchronize的好处

  1. trylock
  2. 公平锁
  3. 读写锁

synchronized与volatile的异同

同:

synchronized可以做主存与线程副本之间的同步,volatile只有主存

  1. 将数据从主存复制到线程副本
  2. 将数据从线程副本同步到主存

异:

synchronized可以做互斥

加锁的方式有5种 synchorized lock countdownlatch 栅栏 信号量

信号量主要是为了细粒度的控制并发量

服务分组好处是机器分组 服务隔离

解决jar包冲突最好的办法是自定义class loader 实现类加载隔离

超时 其实就一个定时任务 超时后调用回调函数响应超时
远程调用的四种方式 Oneway不关心结果 2 被动回调 3 future 主动控制超时 4 可靠异步就是消息中间件

rpc的过程 路由 编码 代理 网络 限流 解码 反射 返回

消息中间件

如何保证消息发送一致性

也就是业务操作成功后,消息一定会发出去 ,业务失败,消息一定发不出去

  1.  先将消息写入中间件库 状态为待处理
  2. 然后调用业务操作,
  3. 如果成功后 将消息改为待发送,失败的话 删除消息

原生JMS消息模型

点对点: 消息只会被一个应用消费,一个应用消费了,另一个应用就不能再次消费了

发布订阅:消费者可以独立收到所有到达Topic的消息

如何保证不同集群互不干扰的消费各自消息,及集群内部不同的连接不重复消费消息?

集群id:对各个连接以集群id分组

点对点模型:在集群内部使用点对点模型,一个应用消费了 其他应用不能消息

如何保证消息的可靠性

持久订阅:即使应用宕机了,消息也会被保存,等应用恢复后,继续消费

持久传输和非持久传输最大的区别是:采用持久传输时,传输的消息会保存到磁盘中(messages are persisted to disk/database),即“存储转发”方式。先把消息存储到磁盘中,然后再将消息“转发”给订阅者。当Borker宕机 恢复后,消息还在

猜你喜欢

转载自blog.csdn.net/qq_29857681/article/details/90578534