《软件架构实践第二版》阅读笔记08

接着上次的《软件架构实践第二版》阅读笔记07继续写:

16、负载均衡算法:轮询:请求依次分发到每台应用服务器上;加权轮询:根据应用服务器的性能进行加权重新分配;随机;最少连接:记录每个应用服务器正在处理的请求连接数,将新的请求分配到连接数最少的服务器上;源地址散列。

17、网络IO的实现:BIO;NIO;AIO。

18、BIO采用阻塞的方式实现,也就是说一个Socket套接字需要使用一个线程来处理。支持并发的连接,需要更多的线程来完成这个工作。

19、NIO基于事件驱动思想,采用的是Reactor模式。可以在一个线程中处理多个套接字Socket相关的工作。Reactor会管理所有的handler,并把出现的事件交给相应的handler去处理。

20、AIO就是异步IO。采用Proactor模式,AIO与NIO的区别:AIO在读写操作时,只需要调用相应的read/write方法,并且需要传入CompletionHandler;在完成动作后会调用CompletionHandler。而NIO的通知是发生在动作之前,是在可写可读的时候,selector发现这些事件后调用handler处理。

21、控制器的变化:使用硬件负载均衡——》使用软件负载均衡(LVS)(透明代理,请求发送发和处理方都不需要知道对方,但是存在不足:增加网络的开销,比如流量和延时;代理出现问题则所有请求都会受到影响)——》采用名称服务直连方式请求调用(名称服务器是通过跟请求处理的机器交互来获取这些机器的地址)——》采用规则服务器控制路由的请求直连调用(规则服务器本身并不和请求处理的机器进行交互,只负责把规则提供给请求发起的机器)——》master+worker的方式(存在一个master来管理worker)

22、运算器的变化:DNS调度——》DNS+负载均衡调度(DNS返回的永远都是负载均衡设备的地址)

23、存储器的变化:单机的Key-Value服务——》使用代理服务器的多机Key-Value服务——》使用名称服务的Key-Value服务——》使用规则服务器的Key-Value服务——》通过Master的Key-Value服务

24、分布式系统的难点:①缺乏全局时钟;②面对故障独立性;③处理单点故障;④事务的挑战

25、数据库读写分离:两个问题:数据复制问题(使用数据库本身提供的数据复制机制,但还是存在复制延时的数据不一致性问题);应用对于数据源的选择问题(写操作要走主库,事务中的读操作也要走主库)

26、搜索引擎技术解决大型网站站内搜索时的某些场景下的读的问题,提供了更好的查询效率,站内搜索结构和使用读库非常相似,只是多了自己建立数据索引的步骤。

27、缓存:数据缓存(全数据缓存(数据库的数据发生变化后会把数据写入到缓存中,保证数据不会读取失效);热数据缓存(应用访问缓存,如果数据不存在则去数据库里读取并把数据加入到缓存中));页面缓存(ESI规范)

28、缓存的一个关键指标缓存命中率,如果缓存命中率比较低的话就意味着有不少请求要回到数据库中查询。还要考虑缓存服务器的扩容与缩容(一致性hash)以及缓存数据更新(定时失效,数据变更时失效,数据变更时更新)。

29、数据库拆分:专库专用,数据垂直拆分(不同业务数据拆分到不同的数据库中);数据的水平拆分(把同一个表的数据拆分到不同的数据库中)。

30、服务化:把应用分为三层,处于最上端的是Web系统,用于完成不同的业务功能;处于中间的是一些服务中心,不同的服务中心提供不同的业务服务,处于下层的则是业务的数据库同时引入了远程调用,共享代码不再散落在各个应用中而是放到了各个服务中心上。数据交互工作由业务服务中心完成。

31、远程过程调用和对象访问中间件(主要解决分布式环境下应用互相访问的问题);消息中间件(解决应用之间的消息传递,解耦以及异步问题);数据访问中间件(主要解决应用访问数据库的共性问题)

32、静态代理与动态代理?静态代理为每一个被代理的对象构造对应的代理类。动态代理是动态地生成具体委托类的代理实现对象,通过Proxy.newProxyInstance来创建代理方法可以为不同的委托类都创建代理类。方法调用使用invoke。

33、服务化使得原来的一些本地调用变为了远程调用。远程调用:获取可用服务地址列表->确定要调用服务的目标机器->建立连接->请求序列化->发送请求->接受结果->解析结果



原文地址:https://www.cnblogs.com/cuijunfeng/p/13057840.html