首页 > 科技 > 程序员架构实战案例——分布式架构演变

程序员架构实战案例——分布式架构演变



前言

随着计算机系统规模变得越来越大,将所有的业务单元集中部署在一个或若干个大型机上的体

系架构,已经越来越不能满足当今计算机系统。同时,随着微型计算机的出现,越来越多廉价

的PC机成为了各大企业IT架构的首选,分布式的处理方式越来越受到业界的青睐。本文将介绍

分布式架构的发展历史和分布式架构的一些相关概念。

下面以一个简单的电商系统为例,当数据量、访问量提升,观察这个系统可能会发生的结构变

化。假如我们系统具备以下功能:用户模块(用户注册和管理),商品模块(商品展示和管

理),交易模块(创建交易及支付结算)。

一、单应用架构

网站的初期也可以认为是互联网发展的早起,我们经常会在单机上跑我们所有的程序和软件。

把所有软件和应用都部署在一台机器上,这样就完成一个简单系统的搭建,这个时候的讲究的

是效率

二、应用服务器和数据库服务器分离

随着网站的上线,访问量逐步上升,服务器的负载慢慢提高,在服务器还没有超载的时候,我

们应该做好规划,提升网站的负载能力。假如代码层面的优化已经没办法继续提高,在不提高

单台机器的性能,增加机器是一个比较好的方式,投入产出比非常高。这个阶段增加机器的主

要目的是将web 服务器和数据库服务器拆分,这样不仅提高了单机的负载能力,也提高了容

灾能力。

三、应用服务器集群

随着访问量的继续增加,单台应用服务器已经无法满足需求。在假设数据库服务器还没有遇到

性能问题的时候,我们可以增加应用服务器,通过应用服务器集群将用户请求分流到各个服务

器中,从而继续提升负载能力。此时多台应用服务器之间没有直接的交互,他们都是依赖数据

库各自对外提供服务。

架构发展到这个阶段,各种问题也会慢慢呈现,比如用户请求由谁来转发到具体的应用服务

器,这时候可能会出现下面的架构模型。

四、数据库读写分离

当数据库压力变大时,那么怎么去提高数据库层面的负载呢?有了前面的思路以后,自然会想

到增加服务器。但是假如我们单纯的把数据库一分为二,然后对于后续数据库的请求,分别负

载到两台数据库服务器上,那么一定会造成数据库不统一的问题。所以我们一般先考虑读写分

离的方式。

五、使用搜索引擎缓解读库的压力

数据库做读库的话,常常对模糊查找效率不是特别好,像电商类的网站,搜索是非常核心的功

能,即便是做了读写分离,这个问题也不能有效解决。那么这个时候可以引入搜索引擎,使用

搜索引擎能够大大提高我们的查询速度。

六、引入缓存机制缓解数据库的压力

随着访问量的持续增加,逐渐出现许多用户访问同一部分内容的情况。对于这些热点数据,没

必要每次都从数据库去读取,我们可以使用缓存技术,比如memcache、redis 来作为我们应

用层的缓存;另外在某些场景下,比如我们对用户的某些IP 的访问频率做限制,那这个放内存

中又不合适,放数据库又太麻烦,这个时候可以使用Nosql 的方式比如mongDB 来代替传统

的关系型数据库。

七、数据库的水平/垂直拆分

我们的网站演进的变化过程,交易、商品、用户的数据都还在同一个数据库中,尽管采取了增

加缓存,读写分离的方式,但是随着数据库的压力持续增加,数据库的瓶颈仍然是个最大的问

题。因此我们可以考虑对数据的垂直拆分和水平拆分。

垂直拆分:把数据库中不同业务数据拆分到不同的数据库。

水平拆分:把同一个表中的数据拆分到两个甚至更多的表中。

八、应用的拆分

随着业务的发展,业务越来越多,应用的压力越来越大,工程规模也越来越庞大。这个时候就

可以考虑将应用拆分,按照领域模型将系统拆成用户、商品、交易子系统。

这样拆分以后,可能会有一些相同的代码,比如用户操作,在商品和交易都需要查询,所以会

导致每个系统都会有用户查询访问相关操作。这些相同的操作一定是要抽象出来,可以通过服

务化的方式来解决。

九、服务化

服务拆分以后,各个服务之间可以通过RPC 技术进行通信,比较典型的有:webservice、

hessian、http、RMI等。


本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.sosokankan.com/article/1933621.html

setTimeout(function () { fetch('http://www.sosokankan.com/stat/article.html?articleId=' + MIP.getData('articleId')) .then(function () { }) }, 3 * 1000)