如何提高代码的扩展性(1)

简介: 如何提高代码的扩展性(1)

一、架构的高可用?(不是本文的重点)


image.png


(1)【客户端层】到【反向代理层】的高可用,是通过反向代理层的冗余来实现的。以nginx为例:有两台nginx,一台对线上提供服务,另一台冗余以保证高可用,常见的实践是keepalived存活探测,相同virtual IP提供服务。当nginx挂了的时候,keepalived能够探测到,会自动的进行故障转移,将流量自动迁移到shadow-nginx,由于使用的是相同的virtual IP,这个切换过程对调用方是透明的。


(2)【反向代理层】到【站点层】的高可用,是通过站点层的冗余来实现的。假设反向代理层是nginx,nginx.conf里能够配置多个web后端,并且nginx能够探测到多个后端的存活性。当web-server挂了的时候,nginx能够探测到,会自动的进行故障转移,将流量自动迁移到其他的web-server,整个过程由nginx自动完成,对调用方是透明的。


(3)【站点层】到【服务层】的高可用,是通过服务层的冗余来实现的。“服务连接池”会建立与下游服务多个连接,每次请求会“随机”选取连接来访问下游服务。当service挂了的时候,service-connection-pool能够探测到,会自动的进行故障转移,将流量自动迁移到其他的service,整个过程由连接池自动完成,对调用方是透明的(所以说RPC-client中的服务连接池是很重要的基础组件)。


(4)【服务层】到【缓存层】的高可用,是通过缓存数据的冗余来实现的。

缓存层的数据冗余又有几种方式:第一种是利用客户端的封装,service对cache进行双读或者双写。缓存层也可以通过支持主从同步的缓存集群来解决缓存层的高可用问题。当redis主挂了的时候,sentinel能够探测到,会通知调用方访问新的redis,整个过程由sentinel和redis集群配合完成,对调用方是透明的。


   (5)【服务层】到【数据库读】的高可用,是通过读库的冗余来实现的。

既然冗余了读库,一般来说就至少有2个从库,“数据库连接池”会建立与读库多个连接,每次请求会路由到这些读库。当读库挂了的时候,db-connection-pool能够探测到,会自动的进行故障转移,将流量自动迁移到其他的读库,整个过程由连接池自动完成,对调用方是透明的(所以说DAO中的数据库连接池是很重要的基础组件)。


(6)【服务层】到【数据库写】的高可用,是通过写库的冗余来实现的。

以mysql为例,可以设置两个mysql双主同步,一台对线上提供服务,另一台冗余以保证高可用,常见的实践是keepalived存活探测,相同virtual IP提供服务。自动故障转移:当写库挂了的时候,keepalived能够探测到,会自动的进行故障转移,将流量自动迁移到shadow-db-master,由于使用的是相同的virtual IP,这个切换过程对调用方是透明的。


image.png


X轴和Z轴已经趋于成熟。以后的发展方向必定是业务功能的发展,代码的高可用。


二、软件项目的变化(为什么要提高代码的可扩展性【背景】)



image.png

image.png


软件设计的唯一产出物---代码

面向对象的目的是模块化

相关文章
|
16天前
|
设计模式 算法
探索灵活性与可维护性的利器:策略(Strategy)模式详解
探索灵活性与可维护性的利器:策略(Strategy)模式详解
|
10月前
|
设计模式 算法
如何优雅地使用策略模式来实现更灵活、可扩展和易于维护的代码?
如何优雅地使用策略模式来实现更灵活、可扩展和易于维护的代码?
60 0
|
12月前
【系统架构】模块化开发方法
【系统架构】模块化开发方法
130 0
|
12月前
|
容器
【系统架构】组件与(模块化和应用集成)的区别
【系统架构】组件与(模块化和应用集成)的区别
198 0
|
SQL 监控 Kubernetes
业务逻辑复杂如何解决性能问题
上节针对生成订单信息这个接口做了三个阶段的分析定位和优化动作,让TPS变得正常。不过,系统资源并没有完全用起来,这个接口显然还有优化空间。性能优化的过程中,要把资源都用起来。
130 0
|
缓存 监控 安全
API设计中性能提升的10个建议
API设计中性能提升的10个建议
|
UED
易用性测试小结
易用性测试小结
184 0
易用性测试小结
|
存储 缓存 固态存储
如何写出高性能代码(四)优化数据访问
同一份逻辑,不同人的实现的代码性能会出现数量级的差异; 同一份代码,你可能微调几个字符或者某行代码的顺序,就会有数倍的性能提升;同一份代码,也可能在不同处理器上运行也会有几倍的性能差异;十倍程序员不是只存在于传说中,可能在我们的周围也比比皆是。十倍体现在程序员的方法面面,而代码性能却是其中最直观的一面。
118 0
如何写出高性能代码(四)优化数据访问
|
算法 编译器 C++
C++ 最佳实践 | 4. 可维护性
C++ 最佳实践 | 4. 可维护性
61 0
|
前端开发
模块化操作
模块化操作
112 0