单机、集群和分布式相关概念理解
单机
一个系统业务量很小的时候所有的代码都放在一个项目中就好了,然后把这个项目部署在一台服务器上就可以了。整个项目的所有服务都由这台服务器提供。这就是单机结构。但是单机结构的缺点非常明显,当业务量增加到一定程度的时候,单机的硬件资源无法满足业务要求(单机容量问题),此时出现了集群模式。
集群
单机处理达到瓶颈的时候,将单机复制几份,这样就构成了一个集群。集群中每台服务器就叫做这个集群的一个节点,所有节点构成一个集群。每个节点都提供相同的服务,这样系统的处理能力就相当于提升了好几倍。
但这里需要考虑的一个问题是,用户的请求由哪个服务器来处理呐?
—让此时负载较小的节点来处理,这样使得每个节点的压力都比较平均。
因此,我们需要在所有节点之前增加一个负载均衡服务器,用户所有的请求都交给他,然后负载均衡器根据当前所有节点的负载情况,决定将这个请求交给哪个节点进行处理。
但是,当业务发展到一定程度的时候,发现无论怎么增加节点,整个集群的性能提升效果不明显了,这个时候,我们需要使用分布式。
这里,发现从单机结构到集群结构,代码基本不需要做任何修改,仅仅是多部署几台服务器,每台服务器上运行相同的代码就行了。
分布式
分布式,就是将一个完整的系统按照业务功能,拆分成一个个的独立的子系统,在分布式结构中,每个子系统就被称为“服务”。这些子系统能够独立运行在web容器中,他们通过RPC方式通信。
比如秒杀系统项目中,我们需要按照功能模块拆分成多个独立的服务:用户服务,商品服务,订单服务,库存服务等。这一个个服务都是一个独立的项目,可以独立运行。如果服务之间有依赖关系,可以通过RPC方式调用。降低了系统之间的耦合度,可以独立开发,独立部署,独立测试。
分布式就是将后台工作分布在多个服务器上,多个服务器协同完成工作
分布式系统出现的问题
数据不一致问题
秒杀系统,库存只有一份,所有人会在集中的时间读和写这些数据,多个人读一个数据。(读写冲突)
通信异常
分布式系统将原有的单机通信,变成各个节点依赖网络进行通信,由于网络本身的不可靠性,都会导致分布式系统无法顺利完成一次网络通信。即使完成了一次通信,也需要考虑时间上的延迟。
如何实现分布式事务
订单服务插入之后要调用库存服务更新库存,库存数据不是特别敏感,不需要强一致性,可以通过最终一致性方案实现。
订单服务和库存服务,每个服务维护了自己的数据库,在交易系统的业务逻辑中,一个商品在下单前需要先调用库存服务,进行扣除库存,再调用订单服务,创建订单记录。正常情况下,两边数据库各自更新成功,两边数据维持着一致性。但是在非正常情况下,