写点什么

如何寻找最佳架构,单体架构还是微服务?

  • 2020-02-06
  • 本文字数:1601 字

    阅读完需:约 5 分钟

如何寻找最佳架构,单体架构还是微服务?

通过观察 IT 社区的现状,Kamil Grzybek认为大多数新项目都采用了微服务架构实现。但是,他认为 IT 行业正在犯一个错误,即我们采用微服务仅仅是因为相信它能够解决单体应用中的所有问题。与之相反,Grzybek 推荐关注架构驱动力(architectural driver),他强调每种架构都有其优点和缺点,都会解决一些问题,但是会带来新的问题。在他的系列文章,他已经描述了模块化单体的基本概念和属性,以及导致特定架构的驱动力


Grzybek 是位于华沙的ITSG Global的架构师和团队领导,他首先指出术语单体系统和单体架构通常用来描述所有的组成部分都放到一个部署单元的系统,但是这些术语通常也会假定其所有的组成部分是相互交织在一起的,而不是由架构上独立的组件所组成,这些组成部分互相连接、互相依存,而不是松耦合的。他认为这是个非常负面的描述,并不是单体的终极属性。相反,他将单体定义为单纯有且仅有一个部署单元的系统。


为了实现模块化,进而实现模块化的架构,Grzybek 指出必须要有独立且可替换的模块,每个模块必须要有定义好的接口并实现接口所描述的功能需要的全部内容。模块从来都不是完全独立的,它总会依赖其他的东西。但是,依赖要尽可能匹配松耦合,强内聚的原则。为了确定模块的独立性和可替换性,我们必须关注三个元素:依赖的数量、这些依赖的强度以及它所依赖的模块的稳定性。


系统中的变更通常针对的是业务功能,而不是技术部分。因此,模块应该从业务的角度提供完整的特性集,以便更加自治和独立。它还应该有一个定义良好的接口,也就是定义模块能够做什么的契约,并将它的实现的隐藏并封装起来。Grzybek 提到,封装是模块化不可分割的一个要素。


架构驱动力指的是对架构有着重要影响的需求集,Grzybek 在这个定义中参考了Michael Keeling。Grzybek 将驱动力分成了四个主要类别:功能性需求定义了系统要解决什么问题以及如何解决;质量属性定义了质量,比如可维护性和可扩展性;技术约束是关于工具限制、团队经验和技术标准的;最后,业务约束则是关于预算、硬性截止时间的。


Grzybek 强调所有的架构驱动力都是彼此关联的,过于关注其中的某一个,往往会导致顾此失彼。他认为,系统的软件架构师就是要在不同的驱动力之间不停地做出选择,Grzybek 指出,并没有预先定义好的正确方案,并不存在所谓的银弹。


在对比模块化单体和微服务架构时,常见的架构驱动力就是复杂程度。Grzybek 发现模块化单体要比分布式系统复杂程度更低。高复杂性会降低可维护性、可读性和可观察性。它也会需要更有经验的团队、更高级的基础设施和特定的组织文化。如果简单性是一个关键的架构驱动力的话,那么他强烈建议团队要首先考虑单体形式并参考 Martin Fowler 的文章:单体优先


在文章中,Grzybek 还讨论了其他的驱动力,包括生产力、可部署性、性能、故障影响和异构技术,对于每种驱动力,他都给出了样例以及该驱动力对不同类型架构的影响。


Grzybek 最后强调:


系统架构的形状会受到各种因素的影响,一切都取决于我们所处的环境。


去年年底,Grzybek发布了一个开源项目,在该项目中,他详细阐述了如何使用领域驱动设计(Domain-Driven Design,DDD)的方式去设计、实现单体应用。他的目标是通过这个项目展示如何以模块化的方式设计和实现单体应用。


在柏林举行的microXchg 2019年会议上,Jan de Vries主张在使用微服务之前先构建一个单体


在 Reactive Summit 2018 会议上,Randy Shoup在演讲中描述了以增量式架构方式构建系统,他表示系统应该从简单的架构开始,并随着需求的增加而不断演化。


在 2015 年的一篇博客文章中,Stefan Tilkov认为微服务的主要好处是在系统的不同部分之间创建了清晰且严格的边界。他反对微服务体系结构始终应该从单体开始的观点,他认为先构建具有清晰分割的结构良好的单体应用,随后再将其转换成微服务是极其困难的,甚至根本不可能。


原文链接:


Modular Monolithic Architecture, Microservices and Architectural Drivers


2020-02-06 09:002566

评论 1 条评论

发布
用户头像
选择什么架构不是重点,没有架构依然能解决问题。有了架构也解决不了问题,为了架构而架构才是蠢材。只要具备实时演进、实时重构的能力,没有架构的架构才是价值所在,期望通过某一种架构解决问题简直是妄想。唯一不变的就是变,因为变我们才有饭吃,才能在这里写代码。如果有这种银弹,早回家钓鱼了。不管选择什么架构,核心在于你要让他具备实时演进的能力,可以让它演进成任意架构,今天的业务适合这种架构,那么就让他慢慢演进,如果明天适合那种,就让慢慢演进成那样。
2020-11-28 17:00
回复
没有更多了
发现更多内容

【架构设计模块五】:设计微博系统中”微博评论“的高性能高可用计算架构

Ryoma

python3学习笔记-20210817(变量名与字符串)

姬翔

ipfs挖矿是怎样赚钱的?ipfs挖矿值得投资吗?

IPFS挖矿值得投资吗 IPFS挖矿是怎样赚钱的

云原生时代到来了么?

escray

学习 极客时间 如何落地业务建模 8月日更

破解AI开课难题!2021 全国人工智能师资培训落地厦门大学

百度大脑

人工智能

Go- 变量

HelloBug

变量 Go 语言

还在死磕 Ajax?那可就 out 了!

编程三昧

JavaScript 大前端 8月日更 Fetch

DAPP去中心化交易所开发|DAPP与APP的区别

Geek_23f0c3

交易所开发 去中心化交易所系统开发 DAPP智能合约交易系统开发

「最好」的敌人是「好」

非著名程序员

提升认知 认知提升 个人提升 8月日更

简简单单实现 Python Web 的登录注册页面,还包含一半逻辑。

梦想橡皮擦

8月日更

耗时24小时整理了网络安全学习路线,非常详细!

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

上游思维:在系统的关键处找一个支点

石云升

读书笔记 8月日更 上游思维

JavaScript单元测试的“抹茶”组合:Mocha和Chai

devpoint

JavaScript 单元测试 8月日更

CODING DevOps 高级架构师王炜入选木兰开源社区首批导师

CODING DevOps

DevOps Nocalhost 木兰开源社区 开发者生态

Go-基本元素

HelloBug

Go 语言

Go- 常量

HelloBug

常量 const Go 语言

Magician has released a new version

Magician网络编程包

Java Web 网络编程 io nio

微服务架构师-docker私有镜像仓库的配置和使用

学神来啦

Linux 容器 微服务 运维 架构师

GIT远程仓库

一个大红包

8月日更

🏆【分布式技术专题】【分布式技术专题】RocketMQ延迟消息实现原理和源码分析

洛神灬殇

RocketMQ 延时队列 8月日更 DelayedQueue

蔚来事故背后,“致命弯道”在辅助驾驶和自动驾驶之间

脑极体

从0开始的TypeScriptの十:泛型

空城机

typescript 大前端 8月日更

高可用架构(下)

编号94530

数据库 架构设计 异地多活容灾 高可用架构

敏捷开发

LeifChen

Scrum 敏捷开发 迭代 8月日更

架构实战营模块五作业

maybe

ipfs矿机公司实力排行如何?ipfs矿机排名如何?

ipfs矿机公司实力排行如何 ipfs矿机排名如何

基于springcloud springboot vue elementui商城源码毕设实战

清风

Vue Java 分布式 毕业设计

java springboot微信小程序授权登录开发

清风

小程序 java小程序

2021 OceanBase 数据库大赛来袭!邀你改编世界,码出未来

OceanBase 数据库

数据库 oceanbase OceanBase 开源 OceanBase 社区版 OceanBase 数据库大赛

OceanBase源码解读(二):SQL的一生

OceanBase 数据库

数据库 分布式数据库 oceanbase OceanBase 开源 OceanBase 社区版

Flink 和流式应用运维(十-上)

Databri_AI

flink API REST API

如何寻找最佳架构,单体架构还是微服务?_架构_Jan Stenberg_InfoQ精选文章