AICon全球人工智能与机器学习技术大会9折特惠中,点击立减¥480! 了解详情
写点什么

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

2020 年 2 月 06 日

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

通过观察 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 年 2 月 06 日 09:001866

评论 1 条评论

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

架构师训练营第一周架构方法学习总结

Geek_xq

有了它,数据库也能空中加油,一边迁移一边跑起来

数据君

架构师训练营第 10 周学习总结

netspecial

极客大学架构师训练营

深入内核,拒绝蒙圈!阿里巴巴一位P7级架构师总结整理的这份《Java架构成长笔记》彻底火了。

Java架构之路

Java 程序员 架构 面试 编程语言

食堂就餐卡系统设计

我们新四军不拿群众一针一线

架构师训练营 -week10-总结

大刘

极客大学架构师训练营

区块链数字版权应用落地开发,区块链版权溯源解决方案

13530558032

区块链跨境溯源平台搭建,助力跨境电商防伪溯源

13530558032

5G矿山,工业真金,以及智能体矿井

脑极体

Week1 命题作业

J

极客大学架构师训练营

《迅雷链精品课》第八课:迅雷链多链结构

迅雷链

区块链

涨薪神作!华为内部操作系统与网络协议笔记爆火,这也太香了吧

Java架构之路

Java 程序员 架构 面试 编程语言

腾讯云数据库登陆印尼,金融行业显神威

数据君

tdsql

架构师训练营第一周UML图

Geek_xq

“通证经济”实质是生产关系的变革

CECBC区块链专委会

通证经济

如何保障企业数据资产的全生命周期安全?看这篇就够了

华为云开发者社区

数据 数据资产 数据安全

分享一份大佬的MySQL数据库设计规范,值得收藏

小Q

学习 架构 面试 JVM 多线程

美团架构师总结整理的这份GitHub标星150K+的神仙笔记,我花了两个月肝完成功面进了阿里定级P7,现在分享出来希望大家也能有所提升!

Java架构之路

Java 程序员 架构 面试 编程语言

一周信创舆情观察(11.16~11.22)

统小信uos

架构方法

raox

极客大学架构师训练营

Week 1 学习总结

J

极客大学架构师训练营

通过python基于netconf协议获取网络中网元的配置数据,助力企业网络控制自动化轻松实现!

华为云开发者社区

通信 企业 网络自动化

ThinkPad X1 Carbon与MacBook有何不同?不止是专业

新闻科技资讯

去“测试”下的测试重生,不为焦虑买单

陈磊@Criss

软件测试 自动化测试 测试开发 智能化测试

EMAS 移动 DevOps 解决方案 —— Mobile DevOps

应用研发平台EMAS

阿里云 DevOps 运维 开发 emas

跨国区块链投资 花式“割韭菜”骗光你的钱

CECBC区块链专委会

区块链

数字时代,如何跟上互联网医院的建设潮?

CECBC区块链专委会

数字化医疗

一文带你了解两种Transformer文字识别方法

华为云开发者社区

人工智能 AI 文字识别

如何保护视频资源?这几个防盗链使用技巧你一定要知道!

腾讯云音视频

音视频 防盗链 内容安全 视频防盗 视频资源防盗

从数据库巨人身上撕开一道口子

数据君

【得物技术】供应链库存幂等实战分享

得物技术

幂等 供应链 得物技术部 实战 得物

新晋管理者都会遇到的6个问题

新晋管理者都会遇到的6个问题

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