一、分布式的产生
说道分布式的产生,就得先了解分布式之前的系统是怎样的。
原有的系统一般都是一个庞大的整体,以包名区分作为模块化,设计的好的系统往往会加入中间业务解耦机制,比如消息事件,异步回调等。
但是依旧会出现2个问题:
1、系统过于庞大,部署启动需要非常多的资源,而性能强劲的服务器往往比较贵,花大价钱买一台服务器部署之后,出于对宕机、服务更新等因素考虑又需要投入成本最少再购置一台服务器当做负载或者备用。
2、程序员的操守不一,开发的过程中会漠视设计原则和开发规范,只想怎么快交差怎么来,导致系统业务耦合度变高,模块化变得越来越模糊,一个业务的改动很容易牵扯出其他问题。
这种情况下出现分布式,分布式更多的是一种系统设计和部署的模式,弥补了一个庞大系统带来的问题,主要体现在系统化整为零、业务分步完成。对于业务耦合度还是很高的。同时也引发了分布式必须要解决和关注的问题,比如事务一致性,远程调用方案,统一日志监控,业务链路追踪等问题,随后出现了非常多的中间件来填补这些问题。然而分布式依旧是个不完美的系统设计(如何不完美后续专门开篇再讲)。
二、分布式的架构
分布式分为2种架构,一般使用都会混合起来。
1、水平扩展:把相同的分布式服务部署多个,或者权重平级的分布式服务部署多个,各个服务之间是平级的关系即为水平扩展。比如:用户服务、商品服务、订单服务,业务之间相互独立互不依赖,没有上下业务线关系存在
2、垂直扩展:把一个业务拆分成多个,单独成为分布式服务单独部署,即为垂直扩展。比如:订单服务拆分为 购物车、下单、支付、结算,业务之间无法独立,耦合度非常高,这种实际的拆分情况需要考虑业务与整体系统包括硬件的承载能力,是一个复杂的过程,需要拿捏恰当,往往这一步可以体现出一个分布式系统设计者的能力。
三、怎样设计一个好的分布式系统
没有万金油的分布式系统设计,不同的业务和部署场景以及不同的方案需求会有不同的设计方式。只有一些标准作为参考。
硬性标准:
1、熟悉当前业务
2、至少会一门编程语言,网络IO,并且熟悉网络结构和网络通信原理
3、熟悉常用的中间件,如 redis、zookeeper、kafka(或其他类似的)等
4、熟悉一种远程调用方案
5、熟悉数据库、磁盘IO
然后可以开始尝试设计一个分布式方案了,如果是研发加运维都会,那会有更大的发挥空间。
好的分布式要满足以下几点:
1、降低业务和代码耦合
2、提高整个系统的业务处理及吞吐能力
3、系统具有扩展性及快速部署可用性,既通常说的高扩展、高可用
4、能够加快研发、持续交付
5、系统监控
不要一上来就想着设计一个多么牛逼的系统,千万不要有这种想法,分布式系统需要根据需求和业务有所侧重,而不是追求均衡发展,设计时需要预知可能会发生的情况,并有方案应对即可。后续需要根据系统出现的问题进行调整,改进。
尽量将实时性要求不高的业务使用异步事件驱动,可以提高系统的处理能力,当然也需要考虑可达性。
具体的实施方案我就不说了,有很多情况,这里没法一一展开说。遇到坑了去解决就行了,技术提升就是这么来的
欢迎关注我的个人公众号
评论区