【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

这 5 种场景不适合采用微服务

  • 2019-12-27
  • 本文字数:1759 字

    阅读完需:约 6 分钟

这5种场景不适合采用微服务

微服务是软件架构的银弹吗?或许不是。这个世界上很少有东西是百分百正确的,微服务也不例外。


在这篇文章里,我们将讨论在设计或重构应用程序时,哪些场景可以使用微服务,哪些场景要避免使用微服务。


首先,我们要了解什么是微服务以及微服务有哪些优势。

微服务是什么?为什么要使用微服务?

顾名思义,微服务就是一个具体的软件服务,通常是基于应用程序上下文定义的一个规模合理的最小化服务。例如,“将文档发送给系统打印机驱动程序”可以算是一个微服务,但“打印字母 n”或许就算不上是。一个应用程序可以由多个微服务组成,这些服务的部署和管理(部署在 pod 或集群中)是独立的,它们组合在一起实现了应用程序的功能。


这意味着我们可以在不重新设计或更新整个应用程序的情况下更新单个微服务,也意味着单个微服务(或多个微服务)发生故障并不会导致整个应用程序瘫痪,一个受到攻击的微服务也不会导致整个应用程序变脆弱。对于复杂的大型应用程序来说,微服务架构比单体架构(传统的非微服务架构)具备更高的可管理性。

1. 应对复杂

既然微服务这么好,为什么不都使用微服务架构呢?事实证明,适用于大型系统的架构不一定适用于规模较小的系统,在设计新系统时所使用的设计方式并不一定适合用来维护或更新已有的系统。


对于微服务架构来说,复杂性可能是一个关键考虑因素。Martin Fowler曾经说过:“……除非你的系统复杂到难以管理,否则不要考虑采用微服务……”换句话说,相比其他因素,复杂性是采用微服务架构最关键的考虑因素。如果复杂性不是你首要解决的问题,那么微服务可能不适合你。


微服务架构需要额外的开销,比如服务设计、服务通信、服务管理和系统资源的使用。采用微服务架构是有代价的,如果一个应用程序无法充分利用微服务的优势,那么为了采用微服务架构而付出的代价就有点太高了。

2. 小团队,大工作

试想有一个中等规模、中等复杂度的应用程序,这个应用程序由一个相对较小的团队负责开发和维护。如果它是一个单体系统,服务之间的通信可以很直接,可以对一些特定的任务进行优化。对于熟悉的代码的小团队来说,维护任务就相对容易。可能有时候开发会有点麻烦,但大多数时候是可控的。


如果让这个小团队开发和维护同样的应用程序,但改成了微服务架构,那么他们的工作量就会显著增加。微服务之间的通信变得很普遍,即使是做一个很小的改动也需要更多的时间,甚至还可能需要修改微服务编排和管理系统。这可能会给运维和开发造成压力。

3. 小到无法拆分

并不是所有的应用程序都大到足以被拆分成微服务。一组由中等规模服务组成的应用程序可能已经按照要求拆分完毕,即使这些服务仍然包含了子服务。


有些模块(比如库存模块和应付账款模块)真的有必要拆分成微服务吗?或者它们其实运行得还不错?可能它们现在的规模已经是恰到好处了,把它们进一步拆分成微服务不仅不会降低复杂性,反而会让系统变得更复杂。

4. 与遗留系统共舞

大部分软件开发人员几乎每天都要面对遗留代码。如果你正在维护一个遗留系统,那么无论它的原始设计多么随意,无论它现在变得多么糟糕,在把它重构成微服务之前,都要认真仔细地思考一下。它正处在生命周期的什么阶段?它是一个任务关键型系统吗(比如包含了一个不可替代的遗留数据库)?你需要几年时间来替换整个系统吗?更新或者替换过程需要一个长期详尽的计划吗?


微服务架构在更新或替换遗留系统方面扮演着重要的角色,但整个过程可能很长,一个没有策略指引的迁移很可能会造成灾难性的后果。

5. 紧密集成

有些应用程序要求各个组件和服务之间紧密集成,比如那些需要快速处理实时数据的应用程序。在服务之间添加新层会导致处理速度变慢。如果系统需要快速处理数据流中的数据(例如来自自动驾驶汽车的传感器数据),那么延迟可能是灾难性的。


嵌入式应用程序通常在响应时间和可用资源方面具有很严格的限制,所以它们的后端通常不太适合采用微服务架构。在设计嵌入式应用程序时,从一开始就要考虑如何让维护变得更简单以及如何让资源使用最优化。微服务通常在资源比较充裕的系统中容易发挥作用,可以帮助降低系统的复杂性。

要不要采用微服务?

你的应用程序适用采用微服务架构吗?如果它非常大,非常复杂,为了更好地管理它,可以考虑采用微服务架构。但如果它运行得很好,那就不要盲目追赶这个潮流。

英文原文

5 Reasons Not to Use Microservices


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2019-12-27 15:555772
用户头像
小智 让所有人认同的文字称不上表达

发布了 408 篇内容, 共 377.3 次阅读, 收获喜欢 1972 次。

关注

评论

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

【Linux】Linux命令快速学习神器tldr、cheat介绍和使用

懒时小窝

Linux tldr cheat

mathtype有免费的吗?如下下载最新版本

茶色酒

MathType2023

音乐制作软件FL Studio21中文绿色版下载

茶色酒

FL Studio 21

高效学 C++|函数参数的引用传递和函数重载

TiAmo

c++ 编程语言、

【如何提高IT运维效率】深度解读京东云基于NLP的运维日志异常检测AIOps落地实践

京东科技开发者

运维 AIOPS nlp 京东云 企业号 1 月 PK 榜

开源数据可视化工具对比:PowerBI VS. DataEase

cynthia

开源 Power BI 数据可视化 大屏 DataEase

真正的AI需要实际的需求

felix

人工智能 算法

MySQL幻读到底是什么?怎么解决?

程序员拾山

MySQL

明道云零代码应用治理分层分级指南与量表

明道云

多活数据中心链路智能调度场景

智维数据

数据中心 DNS 智能运维 应用交付平台 可视化数据

为什么我推荐接口调试一定要用Apipost?

不想敲代码

接口测试 API 研发管理工具

感受 Vue3 的魔法力量

京东科技开发者

前端 代码 Vue3 京东云 企业号 1 月 PK 榜

OpenHarmony社区运营报告(2022年12月)

OpenHarmony开发者

OpenHarmony

软件测试/测试开发 | 接口自动化测试如何处理 Header cookie

测试人

软件测试 自动化测试 接口测试 测试开发

都用过@Autowired,但你知道它是怎么实现的吗

JAVA旭阳

Java spring

MySQL:删除一张表中的前10万行数据,哪种方式效率更高?

程序员拾山

MySQL

软件测试/测试开发丨免安装免配置环境的免费 ios 调试工具 sib 来啦

测试人

软件测试 自动化测试 测试开发 ios测试

到底卡在了哪里,2023年再撒谎网慢就说不过去了

Yestodorrow

架构 可观测性 网站性能

扪心自问,我们在用户旅程的投入有多匮乏?

Yestodorrow

类是如何加载的?

王磊

Java

软件测试/测试开发 | 实战演练接口自动化如何处理 Form 请求?

测试人

软件测试 自动化测试 接口测试 测试开发

架构实战 - 模块 7 作业

mm

架构实战营 异地多活

架构实战 - 模块 8 作业

mm

消息队列 架构实战营

第五周作业-微博评论高性能高可用的计算架构

不爱学习的程序猿

基于AbstractProcessor扩展MapStruct自动生成实体映射工具类

京东科技开发者

Java’ 端口映射 spring、 企业号 1 月 PK 榜 set|get

如何减少网站卡顿的代码级别详细文章

Yestodorrow

重新思考边缘负载均衡

俞凡

架构 netflix 大厂实践

零代码应用搭建规范建议

明道云

IDEA配置java的git路径

孙永潮

防火墙运维的新思考|流量+访问控制策略

智维数据

运维 防火墙 IT

Squirrel状态机-从原理探究到最佳实践

京东科技开发者

生命周期 状态机 建模 企业号 1 月 PK 榜 Squirrel

这5种场景不适合采用微服务_架构_Michael Churchman_InfoQ精选文章