架构的演变
--------------------------------------------------------------------------------------------------------------
一个单机:
一开始时单机架构,用户直接访问服务。
缺点:
1、不安全,当服务器宕机时,整个系统就无法使用;
2、高并发,单机架构处理业务的能力有限,当出现高并发的情况,系统处理不过来;
多个单机:
比如:某个地区的用户永远都是访问同一个服务器。但是这样服务器的资源没有得到充分的使用,当其中一台服务器宕机时,这个地区的所有用户就无法访问。
相比一个单机架构,多个单机架构也能起到一定的分流作用。业务处理能力应该一个单机的几倍。
缺点:
每个单机系统都是使用自己的数据库。对资源造成浪费。一个单机架构有的缺点,在多个单机架构里也一样存在,问题没有真正解决,相当于只是将问题缓解一下。当用户访问量提高时,需要不断添加一个单机架构,成本非常高。
--------------------------------------------------------------------------------------------------------------
集群:
后来,随着业务的发展,用户访问量大大提升,单机架构已经无法提供支持。就变成集群的架构。
集群方式与多个单机架构有点异同。都是需要部署多台服务器,但是为了提高资源的利用率,使用nginx实现负载均衡,处理业务的能力得到大幅度的提醒。
这种集群方式每个服务器都是在使用自己的数据库。通过nginx负载均衡后,可以将用户的请求分流,集群越多,业务的处理能力越高。
问题1:用户在服务器A登录后,后面发出的请求进入到服务器B,服务器B如何识别该用户?用户发送的是http请求,无状态协议。如何才能共享用户的登录信息?通过session共享实现。不管用户在那个服务器登录,都需要将登录信息保存起来。用户的每次请求过来时,都需要判断一下用户是否登录过。需要注意考虑那种session共享方式。
问题2:数据库信息共享问题,如果用户在服务器A中插入一条数据,然后在服务器B中查询该数据查询不到,怎么办?可以通过适用同一个数据库解决。
缺点:
1、集群架构也是有瓶颈的,当用户到达一定数量时,即使经过nginx负载均衡后,对于单个节点来说,过来的请求依然很多,可能会处理不过来。然后只能通过增加节点的方式来提高系统的处理能力,要不就使用MQ,将部分请求放到队列里面,处理不过来的就直接执行失败操作。
2、集群的节点越多,公司运营的成本就越高。
3、运维人员部署更新难度提升,因为你需要给所有的节点进行更新操作。
4、日志文件维护应该怎么做?每个节点都是一个单体,拥有各自的日志,如何将所有节点的日志整合起来,共同维护?当程序出现bug时,需要找日志,应该怎么处理?网上有很多集群日志解决方案。
--------------------------------------------------------------------------------------------------------------
分布式:
分布式系统就是将一个系统划分不同功能模块的子系统,每个子系统独立部署。
相比集群,分布式架构对资源的利用效率更高。在集群中,当系统的处理能力不足时,直接通过增加节点来提升,每一个节点都是一整个应用,对资源造成极大的浪费。而在分布式架构中就不一样了,如果某一个子系统处理能力不足,我们只需要针对这个子系统进行处理,可以大大减少资源的浪费。
分布式系统也有多种分布方案,一是整个分布式系统使用同一个数据库,二是每个子系统拥有自己独立的数据库。采用不同的方案都有必须的问题需要解决。
问题1:也需要做session共享。
问题2:当一个接口出现异常时,应该如何定位问题所在?
问题3:数据传输安全问题,由于数据不断在不同的子系统之间进行交互,要防止数据在传输过程中被拦截篡改问题。
缺点:
1、增加测试难度。当某个子系统需要更新时,需要整个系统连贯起来测试。
2、事务处理复杂。要注意事务传递问题,当某个请求出现异常时一定要回滚所有对数据库的更新操作。
3、响应时间长。子系统多,请求链路长,导致响应时间变长。