数字化转型与架构 - 架构设计篇|系统组件有哪些?
构件软件系统就像搭建积木一样,从一块块的积木开始组装,也可以使用预先搭建好的模型创造整个场景。这些预先搭建的模型就好比构成系统的各种组件,这些组件可以是类、模块、代码库、程序或者子系统。每个组件都有自己的功能、使用限制和潜在的副作用。
组件分为业务组件和基础技术组件两大类。业务组件是主要设计系统开发过程的编码工作,它们对系统是否满足功能性需求起着关键性作用。而基础技术组件主要参与系统开发过程中的集成工作,它们对系统是否能满足非功能性需求具有重要影响。业务组件通常位于系统核心,并与技术组件交织在一起,共同构成整个系统。
在单体应用架构下,业务组件通常是项目中的各个业务模块。而在微服务架构下,这些组件会拆分为一个个的微服务。在进行组件划分时,我们可以根据业务边界,即业务领域进行划分。领域驱动设计(DDD)也是基于这一思想开发出的软件开发流程框架。由于业务需求不断变化,因此业务边界划分没有一个绝对的标准和对错,每次划分都是一次取舍。通常划分出的业务边界会以微服务程序的形式表现出来,微服务的大小判断与模块大小判断的标准不同,模块大小通常由代码的行数进行判断,而微服务的大小则由涉及的实体数量进行衡量。除了要避免服务过大没有达成拆分效果,我们还应该避免微服务过小。过小的微服务会变成数据存取的 API 接口集,而没有实际的业务处理能力。
业务组件示意图
技术组件通常独立存在于系统之中,协助系统完成更快、更多、更强这三个方向的系统特性。
更快
系统的速度更快不仅可以通过升级系统硬件实现,还可以通过合理的使用缓存组件实现。典型的缓存组件包括部署在系统之外的 CDN,以及系统内部使用的内存数据库。
CDN(Content Delivery Network,内容分发网络)是分布在整个网络中的分布式存储服务器。CDN 把远端数据缓存在较近的网络存储服务器中,从而缩短了数据传播的距离,实现更快速的数据访问。通常情况下,CDN 的带宽远远高于系统所在外部网络出口的带宽,因此 CDN 网络也是一种有效的网络带宽扩容手段。
内存数据库是一种以内存作为存储介质的数据库,内存速度比外部硬盘快一个数量级。尽管内存的速度很快,但由于在断电后会丢失所有数据,因此内存数据库也只能作为缓存使用。为了获得更高的性能和更易扩展容量,内存数据库常采用键值对的数据模型,放弃了关系数据模型。尽管这样提高了灵活性,但也丧失了关系模型中 ACID 的特性。而且导致整个系统中的数据模型无法统一,提升了系统的复杂度。
缓存通过将数据存储在更快的介质中,并利用更近的物理距离提高了访问的速度,但这将导致数据一致性方面的挑战。因此,系统需要设计额外的补偿机制,以确保系统数据的一致性在可接受的指标范围之内。
缓存示意图
更多
更多是系统容量更多,系统容量不仅是存储的数据要多,可以同时服务的用户数量也要多。
DNS(Domain Name System)域名系统是一种将易于记忆的域名(如 www.website.com)映射为网络 IP 地址的系统。这种映射关系不仅有助于人类记忆,还在系统部署和网络调整中发挥关键作用。在使用域名系统之后,所有网络上的数据访问都会先用域名请求 DNS 服务,从而获得 DNS 中配置的 IP 地址。此外,DNS 也提供一个域名映射为多个 IP 地址的功能,这样多个在线服务器可以使用相同域名对外提供服务。
负载均衡服务(Load Balance Service)是快速增加服务数量的最有效方法。负载均衡服务本身不提供实际的服务内容,而是可以接受更多的网络连接并把这些请求均匀的分发给下一层的多个服务器。它就像餐厅的领位员,可以把顾客指引到空闲的餐桌,但无法提供更多的服务。数据库中间件可以看作是数据库领域中的一种负载均衡。
负载均衡是分布式系统的一种解决方案,还有一种主控模式与 DNS 解析域名有几分相似。主控制服务器只提供分片节点的信息,不再提供网络连接,所有业务操作由分片节点独立完成。
“分布式”示意图
更强
更强并不是系统的性能有多高,而是系统更具韧性。更有韧性的系统在遇到流量洪峰时不易崩溃,更能抵受住冲击。
消息中间件可以将系统之间的硬链接改为柔性连接。当上层系统调用下层系统时,上层系统不再一直等待下层系统处理完成,而是通过消息的方式投递给下游。当下层系统处理完成后,再通过消息的方式通知上层系统。尽管消息中间件提供了更强的韧性,但并不如接口调用直接快捷。
即使存在消息中间件,但是系统间的直接调用也无法避免。熔断组件给系统调用增加了一道保护机制,以防止下层故障对上层系统产生连锁反应。当下层系统出现异常时,上层系统的熔断组件进入熔断状态,直接阻止对下层系统的请求。一旦进入熔断状态,熔断组件会定期检查下层系统是否恢复正常。当下层系统恢复后,熔断组件将恢复上层系统的请求。
监控组件就像系统状态的晴雨表,它能够准确反映出系统当前的压力和瓶颈所在。监控组件通过收集系统的资源数据、请求数量等指标衡量系统的状态。
消息调用方式示意图
熔断与监控示意图
组件的初衷是为了复用代码成果和降低开发成本,因此在选择组件时应根据具体情况进行权衡,而不应该盲目追求炫技,随意堆砌组件。
版权声明: 本文为 InfoQ 作者【数字随行】的原创文章。
原文链接:【http://xie.infoq.cn/article/f39f8f68cf1307309404a6668】。文章转载请联系作者。
评论