架构设计的技巧

架构设计自然也有一些技巧的。

1.分层

一个软件通常分为表现层(UI部分)、接口层(后台服务的通讯接口部分)、服务层(实际服务部分)、存储层(持久化存储部分,存储到文件或者数据库)。

分层的软件,可以解耦各个模块,支持并行开发,易于修改,易于提升性能。

2.SOA(Service-Oriented Architecture,面向服务的结构)

模块之间通过网络通讯互相连接,松耦合。每一个模块可以独立部署,可以增加部署实例从而提高性能。每一个模块可以使用不同的语言和平台开发,可以重用之前开发的服务。SOA常用的协议有WebService、REST和JSON-RPC等。

3.性能瓶颈

在架构设计的时候一些做法能巧妙化解性能瓶颈。

化同步为异步。

用内存队列(Redis),工作流引擎(JBpm)等实现。内存队列容易丢失数据,但是速度快。工作流引擎会把请求保存到数据库中。

通过化同步请求为异步请求,基本上99.99%的性能问题都可以解决。

用单机并行硬件处理。

比如使用GPU,FPGA等硬件来处理,提高性能。

用集群计算机来处理。

比如使用Hadoop集群,用多台计算机来并行处理数据。

在自己的软件栈中,也可以把一个模块部署多份,并行处理。

用Cache来满足请求。常用的内容加热Cache后,大量的用户请求都只是内存读取数据而已,性能会得到很大的提升。

Cache是上帝算法,记得好像它的性能只比最佳性能低一些,就好像你是上帝,能够预见未来一样。

现在X86CPU遇到了主频限制,CPU提升性能的主要途径就是增加高速Cache了。

4.大系统小做

遇到大型系统不要慌,把它切分成多个模块,用多个小程序,通过SOA协作来解决。这秉承了Unix的设计思想。Unix上开发了大量单一目的的小程序,它主张用户通过管道来让多个小程序协作,解决用户的需求。当然,管道方式通讯限制太多,不够灵活。因此,现在我们可以通过URI,即通过SOA的方式来让多个程序协作。Andorid和iOS上的应用程序,现在都是通过URI实现协作的。这也算是Unix设计思想的现代发展吧?!

5.Sharding(切片)

现在有一个潮流,就是去IOE(I-IBM大型机,O-Oracle数据库和E-EMC存储)。之前的大型系统常用IOE架构,在大型机上部署一个Oracle数据库,Oracle数据库用EMC存储保存数据。IOE是当今最强的计算机,数据库和存储。但他们面对海量系统也有抗不住的一天。

Oracle数据库是ShareEverything的,它可以在一个计算机集群(服务器节点不能超过16个)上运行。计算机集群都共用一个存储。去IOE运动,标志着ShareEverything模式的破产。必须使用ShareNothing,系统才能无限扩展。而用MySQL数据库就可以应付任意规模的数据了。前提是,你会Sharding分片。把大系统切分成若干个小系统,切分到若干台廉价服务器和存储上。更Modern一些,就是切分到大量虚拟机上。

比如铁道部的12306网站。我们知道火车票都是从属于某一列列车的。那么我们把每一个列车作为一个单元来切分,就可以把12306网站切分成几千个模块。一台虚拟机可以承载若干个模块。当某些列车成为性能瓶颈之后,就可以把它们迁移到独立的虚拟机上。即使最终有部分列出服务不可用,系统也不会完全不可用。

12306网站只有一个全局的部分,就是用户登录。这个可以交给第三方负责。如可以让用户用微信,微博,qq等账户登录。也可以自己实现用户登录服务。还是用切片的方式,用多台Redis服务器提供服务。Redis服务器存储每一个登录用户的sessionId和userId,角色,权限等信息。sessionId是随机生成的,可选择其部分bit用于标识它在哪一个Redis服务器上。用户登录后,把sessionId发给客户。用户每次请求时把sessionId发回给服务器。服务器把sessionId发给Redis服务器查询得到其用户信息,对用户请求进行处理。如果在redis服务器上找不到sessionId,则让用户去登录。即使所有注册用户同时登陆,也不需要太多的内存。而且,可以在session内存过多时,删除最早登陆的用户的session,强制他再次登陆。同时活跃的用户数不会太多。

"你以为的岁月静好,不过是有人替你遮风挡雨。"

原文地址:https://www.cnblogs.com/yanggb/p/11829070.html