写点什么

停止盲目使用微服务

  • 2022-02-17
  • 本文字数:1634 字

    阅读完需:约 5 分钟

停止盲目使用微服务

为什么大多数公司最好要避免使用微服务呢?微服务看起来是一种很好的解决方案。从理论上讲,微服务可以加快开发速度,同时允许你独立扩展应用程序的不同部分。但在现实中,微服务是有隐藏成本的。也就是说,我认为,在没有亲自构建微服务之前,你不可能理解它们有多复杂。


下面是我在构建微服务(有时是失败的)时所学到的经验心得。

管理数据是一场噩梦


保持微服务间的数据同步可能是一项挑战。


每个微服务都有一个数据库,这是推荐的模式。它允许松散的耦合,并且可以让特定服务团队在无需放慢速度协作共享代码的情况下,独立地工作。但如果本应同步启动的微服务中的一个出现故障时,会发生什么呢?比如,其中一个微服务更新了其数据库,而另外一个却没有。这种情形会导致数据不一致。


根据个人的经验,调查跨服务的数据不一致会非常痛苦。错误的跨服务性质需要一个人在不同的服务中工作来修正错误。遗憾的是,这就导致了微服务的优势,即专门针对团队的服务,无法发挥作用。


在一个单体应用中,只要把两个数据库调用合并到一个原子事务中,就能很容易地避免这种情况,因此,所有的插入都会成功,或者都不会成功。非常的简单。但是,松散的藕合会使微服务变得更为难以实现。

设置时间更长


构建一个微服务架构所花费的时间要比将相同的特性整合到一个单体应用中要多得多。尽管单个服务是非常简单的,但是交互的服务集合要远比单一的单体更加复杂。在一个单体中,一个函数可以调用任何其他公共函数。但是,微服务中的函数仅限于调用同一个微服务中的函数。这就需要服务之间的通信。构建 API 或者消息传递来促进这一点并不容易。而且,跨微服务的代码重复也是不可避免的。当一个单体应用可以一次定义一个模块并多次导入,而微服务是它自己的应用:在每一个模块都必须定义模块和库。

微服务最适合大型团队


将微服务分派到各个团队的奢侈做法是留给大型工程部门。尽管这对这个架构来说是一个很大的优势,但是如果你拥有足够的工程师来为每一项服务指定一些工程师,那么这才是可行的。减少代码范围,可以让开发人员对代码有更好的理解,加快开发的速度。但是,大部分的初创公司都没有这样的奢侈。在一个创业早期的公司,由于缺乏足够的资源,有些工程师必须在所有的服务之间工作。遗憾的是,这样做会降低工作效率,因为在不同的应用中跳跃,可能会导致环境的变化。我发现,在我已经很久没有关注的微服务中调查 Bug,是一件非常令人筋疲力尽的事情。

DevOps 更复杂


选择微服务最有说服力的一个原因就是可以在不同类型的服务器上运行不同的服务。这是为什么呢?React 前端的内存、CPU 和启动时间的需求与训练机器学习模型的服务大相径庭。为每一项服务选择适当的基础架构类型,可以极大地减少费用。但是,这也给自己带来了一个挑战。


举个例子,在我的职业生涯初期,由于忘记重启一个更新过代码的服务,导致我丢失了大量的生产数据。过期的代码会通过 API 来接收数据,却没有把数据存入数据库,反而消无声息地失败。这样的数据就会永远丢失了。


我之所以提出这一点,是想要表明,配置、维护和监控多个微服务,要比单一的单体应用要复杂得多。拥有多个应用程序,还为骇客增加了多个攻击面。


从理论上讲,“松散耦合”的服务允许每个服务在其他服务失败时继续工作。但这只是一厢情愿的想法:对于有客户的复杂业务来说,很难实现真正的松散耦合。


最终,你的应用程序架构的可靠程度取决于最薄弱的部分。移动的碎片越多,出错的可能性就越大。

总结


许多公司使用微服务并不是真正需要它们,而且尽管微服务现在很流行,但它们并不适合初学者。大多数公司最好的做法是构建一个单体,然后在绝对必要的时候将单体的部分拆分到微服务中。


把从头开始的微服务架构的机会留给那些财力雄厚的大型科技公司。


你的早期阶段的创业公司也许还没有准备好。我的公司就没有准备好,结果,让我们付出了大量的时间和精力。


作者介绍:


GreekDataGuy,开发者。


原文链接:


https://betterprogramming.pub/stop-using-microservices-build-monoliths-instead-9eac180ac908

2022-02-17 17:175416

评论 3 条评论

发布
用户头像
不敢苟同,事实上是,单体一旦形成很难转型到微服,微服也不会像作者说的很难配置和监控,举个我自己的例子,微服部署在Azure AKS,所有的微服通过Gateway以Client的形式进行交流, 至于监控有太多的实时监控软件比如我用的是kubernetic
2022-03-19 14:26
回复
用户头像
笔者应该是传统架构往微服务架构转型的践行者,很大可能性是刚刚开始尝试使用微服务。微服务架构很多时候和云平台配合可能更容易成功一些。微服务架构已经屏蔽了底层的数据操作,用微服务架构再考虑数据的同步,应该是建设思路和微服务架构理念不适配。
2022-02-22 18:13
回复
用户头像
我们是需要提供很多各种各样的API接口,因此按照业务分类、性能要求拆分了10+个小的微服务,可以提高接口性能和服务稳定性
2022-02-20 18:49
回复
没有更多了
发现更多内容

艾瑞咨询:青云科技入选中国开源软件产业图谱

青云技术社区

云计算 开源 混合云

Mysql数据库表中有索引为什么还是查询慢?

慕枫技术笔记

数据库 2月月更

全方位构建信创生态体系,焱融科技完成海光 CPU 生态兼容性认证

焱融科技

云计算 分布式 高性能 文件存储 生态

模块七课程作业

李晓笛

架构实战营

面试突击23:说一下线程生命周期,以及转换过程?

王磊

“区块链”将彻底改变人类社会文明,颠覆世界最强大的企业

CECBC

元宇宙时代NFT的价值衡量

CECBC

使用APICloud AVM多端组件快速实现app中的搜索功能

YonBuilder低代码开发平台

前端 APP开发 APICloud 跨端开发 跨端框架

前端培训:Vue3 的自定义指令

@零度

Vue 前端开发

优酷 IPv6 演进和实践指南

阿里巴巴终端技术

ipv6 移动网络

深入解析 Flink 细粒度资源管理

Apache Flink

大数据 flink 开源 编程 实时计算

第七周

cqyanbo

数蛙DG-IoT开源平台

dgiot

物联网 2月月更 2月日更 dgiot dgiot物联网

幂等最佳实践

得物技术

数据 幂等 API 一致性 请求

MongoDB University 中文字幕视频上线!

MongoDB中文社区

mongodb

Kubernetes集群监控平台(kube-prometheus-stack/Metrics Server)搭建教程

山河已无恙

Kubernetes Kubernetes 集群 2月月更

8分钟了解TDengine的WAL机制

TDengine

数据库 tdengine 开源 物联网

什么字体更适合程序员?

lencx

程序员 字体设置 主题

MongoDB在vivo评论中台的应用案例

MongoDB中文社区

mongodb

【C语言】 初始函数 & 数组

謓泽

数组 C语言 函数 2月月更

模块七作业-王者荣耀商城异地多活架构设计

CH

架构实战 「架构实战营」

java培训:JVM参数配置

@零度

JVM JAVA开发

Tapdata 在线研讨会:如何快速上手 Tapdata Cloud?

tapdata

数据库 Cloud

Linux系统编程-进程间通信(消息队列)

DS小龙哥

消息队列 2月月更

数字货币或将消灭银行!未来3至5年,银行业可能将崩溃?

CECBC

报名开启 | 2月25日,索信达监管合规产品线上发布会

索信达控股

大数据培训:Flink 快照分析

@零度

flink 大数据开发

架构实战营第 4 期第 7 课作业:王者荣耀商城异地多活架构设计

owl

「架构实战营」

来喷一下所谓无影云电脑

乌龟哥哥

无影云电脑 2月月更

如何利用友盟平台定位安卓端的程序异常 | 社区征文

liuzhen007

移动开发 新春征文 2月月更

Go学习笔记——同构复合类型

为自己带盐

Go 学习笔记 2月月更

停止盲目使用微服务_架构_GreekDataGuy_InfoQ精选文章