【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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

  • 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:002378

评论 1 条评论

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

要想组建敏捷团队,这些方法不可少

敏捷开发

团队管理 敏捷开发 敏捷团队

AI落地难?灵雀云助力企业快速应用云原生机器学习MLOps

York

人工智能 机器学习 云原生 降本增效 MLOps

我秃了!唯一索引、普通索引我该选谁?

程序员啊叶

Java 编程 程序员 架构 java面试

分布式 hdfs-over-ftp 工具实现方案

移动云大数据

数牍 X Rust,那些不得不说的事

Jessica@数牍

联邦学习 隐私计算 数牍科技 rust开发者大会 分布式计算框架

如何有效进行回顾会议(上)?

敏捷开发

敏捷 回顾会 项目开发

一文读懂如何部署具有外部数据库的高可用 K3s

Rancher

Kubernetes k8s rancher

什么是SpringMVC?工作流程是什么?九大组件有哪些?

程序员啊叶

Java 编程 程序员 架构 java面试

看了就会的 Rainbond 入门教程

北京好雨科技有限公司

Kubernetes 云原生

你面试十家java开发才能总结出来的面试题(建议收藏)

程序员啊叶

Java 编程 程序员 架构 java面试

一些企业数据平台建设的思考

Bright

数据平台 大数据平台

围绕新市民金融聚焦差异化产品设计、智能技术提效及素养教育

易观分析

新市民金融 差异化产品设计 素养教育

面试官:ThreadLocal使用场景有哪些?内存泄露问题如何避免?

程序员啊叶

Java 编程 程序员 架构 java面试

如何在 TiDB Cloud 上使用 Databricks 进行数据分析 | TiDB Cloud 使用指南

PingCAP

TiDB

【函数式编程实战】(十一) CompletableFuture、反应式编程源码解析与实战

小明Java问道之路

CompletableFuture 7月月更 签约计划第三季 反应式编程 Flow API

企业数字化本质

奔向架构师

数据治理 7月月更

详解Kafka分区副本分配的Bug

石臻臻的杂货铺

7月月更 签约计划第三季

这50道Java面试题看完,想不进大厂都难

王小凡

Java 程序员 面试 面试题 大厂面试

10次面试9次被刷?吃透这500道大厂Java高频面试题后,怒斩offer

程序员啊叶

Java 编程 程序员 架构 java面试

详解.NET的求复杂类型集合的差集、交集、并集

了不起的程序猿

java 14 java程序员 java编程

TDengine 助力西门子轻量级数字化解决方案

TDengine

数据库 tdengine 时序数据库

NFTScan 与 NFTPlay 在 NFT 数据领域达成战略合作

NFT Research

区块链 大数据 NFT 合作 Web3.0

完完整整地看完这个故事,你敢说还不懂Docker?

程序员啊叶

Java 编程 程序员 架构 java面试

牛皮了!阿里面试官终于分享出了2022年最新的java面试题及答案

程序员啊叶

Java 编程 程序员 架构 java面试

蓝海大脑高性能气象大数据平台为气象局掌握风云变幻提供助力

蓝海大脑GPU

58子站安居,经纪人营销管理平台登录接口加密逆向

梦想橡皮擦

Python 爬虫 7月月更

35道MySQL面试必问题图解,这样也太好理解了吧

程序员啊叶

Java 编程 程序员 架构 java面试

基于 MinIO 对象存储保障 Rancher 数据

Rancher

Kubernetes k8s rancher

有奖活动分享:使用WordPress搭建一个专属自己的博客后最高可领取iPhone13

云端explorer

Wordpress 博客部署

融云实时社区解决方案

融云 RongCloud

语音社交系统——完善有声系统产业链

开源直播系统源码

开源源码 语音直播系统源码 语音直播系统 语音直播系统连麦

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