写点什么

微服务的额外代价

  • 2015-06-04
  • 本文字数:1554 字

    阅读完需:约 5 分钟

过去一年里,我们已经听到很多关于微服务的讨论。无论你觉得它们是一种新的架构方式,还是认为它们仅仅是对SOA 理念进行了重新包装,毋庸置疑的是微服务的理念正在席卷整个程序员社区。 Martin Fowler 的一篇文章经常被作为微服务的原始素材所引用,文章详细阐述了像 Netflix 这样的组织使用微服务的经验和成果。最近,Martin 在这个话题上又有新的言论,特别谈到了开发人员什么时候应当考虑使用微服务。

微服务 [噱头化] 带来的的后果之一是,我们看到开发团队太渴望拥抱微服务,却没有意识到他们要为此付出的代价。这增加了一个项目的成本和风险——经常会使项目陷入到严重的麻烦当中。

Martin 承认,微服务的术语最近可能有炒作之势,但它作为一种有用的架构风格已经存在很长时间了。有趣的是,Martin 并没有将这种风格视作 SOA 的一个变种,尽管他作为先驱见证了微服务最早的一些发展。不管微服务的名字叫什么, Martin 还是对程序员想要知道的答案做出了解释:究竟微服务架构对你的系统来讲是不是一个好的选择?

系统自身的复杂性是你决定是否使用微服务的一个决策点。微服务的方法适用于处理复杂系统,但微服务自身也会引入一组新的复杂性问题。当你使用微服务时,你必须有自动部署、监控、异常处理、最终一致性保证,以及其它分布式系统引入的各种复杂因素。

Martin 在他的文章中包含了一个图表,试图展示微服务应用与典型单体应用相比,它是如何改变系统复杂性的。他的建议是:

除非你面对的是一个过于复杂以至于难于管理的单体应用,否则绝对不要考虑使用微服务。大多数的软件系统应该构建为独立的单块程序。确保注重单体应用自身的模块化,而不要试图把它们分离成单独的服务。

有多种驱动程序员使用微服务的复杂难题,包括多应用并存、支持多个业务功能独立发展和扩展。然而,在 Martin 的观点中,采用微服务的决定性因素应当是单块应用已经过于庞杂以至于难以修改和部署。然而,正如我们去年的报道,Simon Brown 做了一个有趣的观察。

如果您正在构建一个单体系统,而它正在变成了一个大杂烩,也许你应该考虑是否足够对软件架构足够关注。你真的理解了软件中核心的结构性抽象吗?它们的接口和责任明确吗?如果不是,你为什么认为迁移到微服务架构可以有所帮助?当然,微服务将迫使你的系统物理分离从而无法走捷径,但是通过单块应用组件之间的分离也能达成同样的效果。

Martin 对于微服务和单体应用的看法更加客观。

很多归结于单体应用的问题其实并不是那种架构风格所自有的。我听说过人们说,你之所以需要使用微服务,是因为在单块应用中无法做到持续交付 - 然而已经有很多公司成功的完成了曲奇分割式部署( cookie-cutter deployment ) 的方式:Facebook 和 Etsy 是两个很著名的例子。

他还认为,将系统规模的增长视作你被迫使用微服务,从而使部件(组件)更容易替换的理由并不成立。认为单体应用不会有定义良好的模块边界的理由也并不充分。然而,Martin 通过实践认为,由于这些边界通常太容易被逾越,所以单体应用很容易被冠以大杂烩( Big Ball of Mud )的称号。总之,Martin 还是希望人们在决定向微服务架构跨越之前,深思熟虑一番,认真考虑架构和系统实现中的所有因素:

当代码规模等复杂性问题不断涌入项目时,我看到很多团队会发现微服务是个不错的选择。你要始终牢记微服务会带来了高昂的额外开销,显著减缓你的开发效率,除非你面对的复杂性难题确实需要微服务来解决。所以如果你能够保证系统足够简单,从而避免使用微服务:那怎么简单就怎么做吧。

查看英文原文 Microservices Premium


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-06-04 10:214820

评论

发布
暂无评论
发现更多内容

工作笔记之 SELECT 语句在 SAP ABAP 中的用法总结(上)

宇宙之一粟

数据库 SAP abap select 9月月更

怎样体面地讲道理?

图灵教育

写作 表达 逻辑

可观测性的常见用例|Techtarget

观测云

Wallys/QCN9024/QCN9074/QCN6024 802.11ax 4x4 MU-MIMO 6GHz wifi6E//AR9582 2x 2 900M 802.11an

wallys-wifi6

QCN9074 QCN9024 QCN6024

日系“怎样”系列新版升级,一本书讲透程序运行的方方面面

图灵教育

Python 程序员 C语言 计算机

智慧楼宇:东京建物引入“ZETA+AI”物联监测方案,实现楼宇预测性维护

ZETA开发者

人工智能 AWS 预测性维护 设备预测性维护 ZETA

软件测试 | 测试开发 | 测试面试题集锦(六)| 软素质篇与反问面试官篇(附答案)

测吧(北京)科技有限公司

测试

深入浅出带你走进Redis!

Java-fenn

Java

人人都用 Bootstrap 的年代过去了,如今我很难向开发者们推荐 Bootstrap 5

Java-fenn

Java 编程 程序员

软件测试 | 测试开发 | 聊聊后端Web开发框架(Python)的简单使用

测吧(北京)科技有限公司

测试

【建议收藏】17个XML布局小技巧

Java-fenn

Java

软件测试 | 测试开发 | 版本控制神器GitHub的基本使用与踩坑,教你一铲子填平!

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 测试平台开发-前端开发之数据展示与分析

测吧(北京)科技有限公司

测试

小间距LED显示屏更受欢迎

Dylan

LED显示屏 led显示屏厂家

关于进阶这件事,这位Python大佬有话说

图灵教育

Python 程序员 进阶 计算机

运维智能化的三大关键技术

穿过生命散发芬芳

9月月更 运维智能化

软件测试 | 测试开发 | JMeter 插件 Ultimate Thread Group 完成梯度递增场景的压测

测吧(北京)科技有限公司

测试

Lath(纯前端容器)打造页面间的无缝平滑连接体验

Java-fenn

Java

软件测试 | 测试开发 | 该如何测客户端专项测试?

测吧(北京)科技有限公司

测试

k8s 中 Pod 的深入了解

Java-fenn

Java

SpringCloud Gateway详解与配置

小黄鸭技术

Gateway 9月月更

图解 Kafka 源码实现机制之客户端缓存架构

Java-fenn

Java

什么是跨域,后端工程师如何处理跨域

C++后台开发

后台开发 后端开发 跨域 C++开发 后端开发工程师

Js 异步处理演进,Callback=>Promise=>Observer

掘金安东尼

前端 异步 函数式 9月月更

揭秘 Jetpack Compose 快照系统 | 开发者说·DTalk

Java-fenn

Java

云渲染快吗?云渲染平台具体怎么用??

Renderbus瑞云渲染农场

云渲染 Renderbus瑞云渲染 云渲染平台

大咖说·实在智能|RPA上云加速电商数字员工时代的到来

大咖说

RPA 全域生参

GoLand 插件推荐

非晓为骁

插件 goland goland插件

Go 语言官方依赖注入工具 Wire 使用指北

Java-fenn

Java

关于进阶这件事,这位 Python 大佬有话说

图灵社区

Python 程序员 进阶 计算机

软件测试 | 测试开发 | 测试开发基础 | 计算机网络篇(二):物理层与数据链路层

测吧(北京)科技有限公司

测试

微服务的额外代价_SOA_Mark Little_InfoQ精选文章