个人博客
Software Architecture Patterns》是 Mark Richards 2015 年出的一本小册子,对常用的架构模式进行了一个简单梳理,书中列了 5 种:
Mark Richards 后续又出了两本书,《Fundamentals of Software Architecture》、《Software Architecture: The Hard Parts》——参见 读后感。
单体架构,将应用这个整体分解为不同的层次,在不同的层次处理不同的问题,即关注点分离原则的一种实际运用。在社会生活的各方面同样可以观察到对该原则的广泛运用,比如组织中的科层制——总经理就不会去厂房打螺丝。软件设计的这种原则往前追溯,可能就借鉴自人们在社会生活中长期实践所总结出的经验。
分层架构在网络中得到了最成功的运用——OSI 分层模型(OSI 模型发展过程中遇到的问题及其解决方案,对其他运用分层思维解决问题的领域具有良好的借鉴意义),在 Web 应用中也广为人知,常用的 MVC 架构即是把应用分解为 模型-视图-控制器 三层,模型层对接业务模型,视图层对接用户界面展示,控制器层居中粘合模型和视图。
典型的 Web 分层架构包括 4 层:
请求必须沿着一定的方向逐层传递,不能跨层——每一层都是 closed 的,这样做的好处是隔离了变化,某一层的变化只影响相邻层,而不会影响其他层。特殊情况下,某层也可以设置为 open —— 即允许被跨越。
总评价:
大多数的应用是请求响应式的,而事件模型是获取相应事件并采取相应的行动。事件驱动架构是一种分布式异步架构,具有高可扩展性。
事件驱动架构有两种拓扑:中介拓扑、代理拓扑。
中介拓扑(mediator topology)
由中介来规划事件应该发送到哪些事件处理器,从而控制整个事件处理过程,如 BPM 业务流程流转。
架构组件包括:
简单的事件中介有 Spring Integration、Apache Camel、Mule ESB,复杂的有 Apache ODE、Oracle BPEL。一种具体的使用方式是将事件分为简单/复杂/困难,每个事件都通过一个简单事件中介,简单事件中介查询事件分类来决定是自己处理还是委托给更复杂的事件中介。
代理拓扑(broker topology)
没有一个中心,使用轻量级消息中间件来充当各个事件处理器的事件代理,如 RabbitMQ、ActiveMQ、HornetQ 等。
架构组件包括:
相比于中介拓扑,代理拓扑没有一个中心组织者,只有各自独立的参与者,但参与者会在传播介质(事件代理)中广播自己对系统做的改动,由其他参与者根据事件做出自己的反应。
因为事件驱动架构是分布式的,所以也需要考虑分布式架构所面临的问题,如对端的可用性、响应性、重连等。另外,从架构本身来说也有两个困难:缺乏原子事务、各事件处理器之间的契约(事件具有自己的结构)的创建、维护和管理。
总评价:
微内核架构一般又称为插件架构,是一种单体架构,架构组件包括:
插件和核心系统之间的通信通常是点对点的,插件之间相互隔离,只和核心系统交互。插件可以是基于编译的,也可以是基于运行时的。
一个关键问题是:核心系统如何发现插件。
常见方案是通过一个注册中心,在注册中心中存放插件的信息,包括名称、数据契约、远程访问协议细节。对于核心系统和插件之间的契约,一般是跨插件域的标准契约,包括从插件返回的行为、输入数据、输出数据。
插件要接入核心系统,可以通过多种方式,如 OSGi、消息、REST 等。某种程度上,博主当前负责的系统也是一个微内核架构,通过动态注册服务来扩展系统的能力。
微内核架构和开源思想可以说是天作之合,这种架构天然鼓励社区参与,对于商业初创产品来说也是合适的——先聚焦核心功能,再逐步推出扩展功能。不只 Linux、Eclipse、Vscode、Nginx 等软件界的明星项目,这种架构思想在硬件架构中也是通用的,继续扩大观察面会发现生活中遍布这种设计思想。
总评价:
留白,春节再续…
以传统的 Web 应用为例,在面对大并发量时,第一个迎接流量洪峰的是 Web 服务器,可以很容易地横向扩展;往下来到应用服务器,应用服务器稍微复杂一点,也可以扩展;最后,洪峰来到了数据库,对数据库做横向扩展通常比较困难。也就是说,最后是数据库的并发事务处理能力,决定了整个系统的最大并发处理能力。当然也可以通过提前的分库分表,通过 apache-sharding 之类的方式来支持更大的并发能力,但从架构上说,难以灵活应对极端并发场景的缺陷是天生的。
于是有了基于空间的架构模式:通过删除中央数据库作为系统中的同步约束,代之以利用复制的内存数据网格,来实现高可伸缩性、高弹性和高性能。
架构组件包括:
虽然在该架构中不再要求有一个中央数据库,但还是可以增加一个,作为初始化加载数据时的来源,和异步持久化数据时的地方。
总评价:
各种架构模式并不是排他的,在实际使用时常常可以根据需要混合使用。
有模式,就有反模式,任何实际工作都不可能完美匹配模式场景,所以不能拘泥于理想的理论描述,而必须结合实际情况,在运用模式无法达到想要效果时进行必要的调整。
需要记住的是,调整一定有代价,架构设计就是权衡是否值得为了一个设计目标而在一定程度上放弃另一个目标。