1、引言
一个使用Java技术栈的大型分布式系统一般由成千上万台机器构成,从机器的视角看,他们都是跑在Linux系统上的JVM进程,执行一定的业务逻辑,本质上是同构的。但是从业务视角看,他们又各有各的不同。本文从业务视角出发,试图对分布式系统进行分解,并阐述他们各自的不同。本文中的很多概念都是我自己发明的,仅仅是为了帮助理解,不具有权威性,如有雷同,只能说我们想到一块去了,纯属巧合!
以面向对象的思维来看,一个对象既包含了数据,又包含了行为。如果把分布式系统看作一个大型复杂对象,那么它的内涵也可以被简单的分为行为和数据,因此,我们不妨尝试把分布式系统初步分解成行为系统和数据系统,其中,数据系统对数据进行统一的管理,而行为系统则是对这些数据进行使用。很显然,这样的分类很粗糙,无法形象的认识分布式系统,所以,我们还需要进一步分解。
2、数据系统
数据系统的职责是对数据进行统一的管理,那么,数据系统对哪些数据进行统一管理呢?按照被管理的数据的不同,我们可以进一步分解出最常见的两个系统:实体系统和单据系统。
2.1、实体系统
实体系统是领域模型相关的,比如交易领域有商品、库存等领域模型,于是就有相应的商品中心和库存中心等。这些系统的核心一定是一个确定的领域模型,所有的业务逻辑都是围绕这个领域模型进行的,不同的实体系统之间一定是有明确边界的。这些系统一般会对外提供基本的增删改查的服务,它需要保证数据存储的高可用以及数据的一致性,同时保证系统的高并发,在技术上一般会涉及到分布式缓存、分库分表、数据库优化、JVM优化等等,
2.2、单据系统
单据系统是实体系统的一个特例,可以看成是高级的实体系统。单据表示的是一种契约,这种契约往往会组合不同的实体,比如交易单,除了交易单本身,它还会包含商品信息和用户信息。单据一般是以状态驱动的,是有一个固定的生命周期的。单据系统需要考虑的是高并发、大数据存储,一般不会涉及缓存。
3、行为系统
行为系统本质上是一条条的业务流程,因此也可以叫业务系统,而业务流程中往往会存在可以复用的业务流和个性化的业务流,因此,业务系统大致可以分为平台型业务系统和垂直型业务系统。
3.1、平台型业务系统
平台型业务系统关注的是构建可复用的流程。比如下单这个流程,无论是天猫下单还是淘宝下单还是阿里旅行下单,在交易中心看来都是一样的,交易中心只会对外提供一个统一的下单接口,不会对每个业务提供单独的接口。从实践角度来说,可复用的流程只能做到粗粒度的可复用,比如把下单流程拆分成几个大的阶段,这些阶段是每个业务都共有的,但是每个阶段不同业务还是会有不同的玩法,因此,平台型业务系统还是会去关注不同的垂直业务规则。平台型业务系统在技术上一般会涉及到流程引擎和规则引擎,还会涉及到分布式锁,分布式事务等。
3.2、垂直型业务系统
垂直型业务系统一般都是整个业务流程的入口,它们是面向用户的。比如淘宝网站,阿里旅行网站,淘票票APP等等,这些我们平常都能看到的东西背后都会对应一个垂直系统,它们接受用户的指令,然后调用内部的其他系统进行业务处理,有点类似于调度机器的角色。垂直线业务系统会直接对接PC端、移动端等,会使用我们常用的MVC框架技术,同时又会使用RPC技术(比如Dubbo)和内部系统通信。垂直线业务系统关注最多的是高并发,这里的高并发不仅仅是对自身的优化,还需要和PC端移动端以及内部其他系统一起优化。
4、支撑系统
在普通的对象中,不管是行为的执行(调用方法)还是数据的存储(属性赋值)都是很显而易见的,因为JVM帮我们封装了复杂性。而在分布式系统中,并没有这样一个全局的JVM来帮助我们,因此我们只能自己开发系统来实现,于是就出现了一套支撑系统。这些系统包括RPC框架、消息中间件、数据分片中间件、分布式缓存中间件等等这些帮助我们在分布式系统进行通信的中间件,也包括了MySQL、redis、hbase等等帮助我们真正存储数据的系统。
5、如何设计一个分布式系统
首先先找出一个或几个关键的领域模型,构建一套实体系统,然后视业务来构建一套单据系统,然后在实体系统和单据系统之上构建一套行为系统。对于行为系统,一开始可以是几个垂直业务系统,然后随着业务的不断深入,慢慢拆分出平台型业务系统。最后选择合适的支撑系统,将上面的几套系统整合起来,并在系统上线后,根据不同系统的特点进行优化。
6、总结
俗话说得好:没图你说个JB。于是我按照上面的分解,画了张分布式系统的简图,以供参考: